Обычно, если ваш delegate
освобожден до выполнения блока, он получит доступ к мусору, поскольку блок является свойством assign
и блок сохраняет self
, а не delegate
, так как вы обращаетесь к немупо ссылке.
Однако, поскольку вы настроили его так, что self.delegate
обнуляется, если delegate
освобожден, у вас не будет этой проблемы.Вместо этого, если ваш delegate
был освобожден, то в вашем коде вы просто отправляете метод otherMethod:
на nil
, который ничего не будет делать, но также не вызовет ошибок.
Если вы хотитеметод, который обязательно должен быть отправлен вашему delegate
, решение состоит в том, чтобы получить доступ к нему по значению вместо ссылки:
- (void)someMethod {
id <SomeDelegate> delegateForBlock = self.delegate;
[someObject doSomethingWithCompletionHandler:^(NSArray *)someArray {
[delegateForBlock otherMethod:someArray];
}];
}
Таким образом delegateForBlock
будет указателем на тот же объект, что и self.delegate
(во время выполнения someMethod:
), и он будет сохранен.
Чтобы узнать больше о том, как это работает, ознакомьтесь с Blocks Programming Topics .