Обычно ответственность за сохранность самого себя лежит на контроллере. Если ваш контроллер запускает задачу в фоновом потоке, то она должна автоматически сохраняться экземпляром NSThread
. Если данные выбираются по сети с использованием NSURLConnection
, контроллер следует сохранить как delegate
.
Если вы не выполняете такую задачу, вы можете использовать синтетические циклические удержания, чтобы сохранить контроллер во время выполнения задачи. Это можно сделать, создав объект, я назову его ObjectRetainer
, у которого просто есть свойство __strong id
. Когда контроллер начинает свою задачу, он должен иметь переменную экземпляра __strong ObjectRetainer
, для которой устанавливается новый ObjectRetainer
, который сохраняет контроллер. Таким образом, контроллер сохраняет ObjectRetainer
, который удерживает контроллер, таким образом предотвращая освобождение любого из них.
Когда контроллер завершает свою задачу и вызывает все необходимые методы делегата, он должен установить для переменной ObjectRetainer
instance значение nil. Это освободит ObjectRetainer
, что, в свою очередь, освободит контроллер.
Интерфейс ObjectRetainer
может выглядеть примерно так:
@interface ObjectRetainer : NSObject {
__strong id object;
}
@property (nonatomic, strong) __strong id object;
@end
Вы должны объявить ivar в заголовке контроллера: __strong ObjectRetainer _retainer
. Затем в методе start
контроллера:
- (void)start {
...
_retainer = [[ObjectRetainer alloc] init];
_retainer.object = self;
}
Когда контроллер будет готов, просто установите _retainer
на ноль:
- (void)performBackgroundTask {
....
[delegate myControllerDidFinish:self];
_retainer = nil;
}