Tôi có bộ điều khiển chế độ xem mà tôi muốn khởi chạy, và sau khi được khởi tạo, hãy sử dụng cùng một bản sao khi có thể (Tôi không sử dụng singleton vì tôi muốn xóa nó khỏi bộ nhớ) , tôi sử dụng getter để làm như vậy, mã của tôi trông như thế này:Chủ đề khởi tạo lười biếng an toàn trên iOS
@property (retain) UIViewController *myController
...
@synthesize myController = _myController;
...
- (UIViewController *)myController
{
if (!_myController) { // Evaluation
_myController = [[MyViewController alloc] init]; // Object Creation
}
return _myController;
}
này hoạt động, nhưng nó không phải là thread an toàn, và nếu có nhiều hơn một thread để đánh giá đúng trước khi đối tượng được tạo ra, tôi sẽ phải rò rỉ bộ nhớ. Một giải pháp mà tôi đã thử là @synchronized mã, nhưng tôi không chắc chắn cách chính xác để làm điều đó.
Điều này dường như làm việc, (lockForMyController là một NSString đơn giản) nhưng nó làm cho phần mã này chậm hơn rất nhiều:
- (UIViewController *)myController
{
@synchronized(self.lockForMyController){
if (!_myController) {
_myController = [[MyViewController alloc] init];
}
}
return _myController;
}
tôi đã tự hỏi nếu có một số cách khác để đạt được một lười biếng khởi tạo, chủ đề an toàn, tài sản?
Tôi gặp sự cố khi điều chỉnh. Tôi có thể làm cho nó hoạt động như một singleton, nhưng sau đó tôi có vấn đề khi tôi sử dụng '[_myController release]; _myController = nil; 'và sau đó tôi thử tạo lại nó, vì tôi không thể đặt lại biến' static dispatch_once_t once'. – Yamanqui
Hmm cho phép tôi cập nhật câu hỏi của mình với đề xuất sẽ hoạt động. – logancautrell
Cảm ơn bạn rất nhiều, giải pháp cập nhật hoạt động hoàn hảo. – Yamanqui