В рамках ResearchKit, я видел такой код:Цель проведения сильной локальной копии переменного делегат
- (void)finishWithReason:(ORKTaskViewControllerFinishReason)reason error:(NSError *)error {
__strong typeof(self.delegate) strongDelegate = self.delegate;
if ([strongDelegate respondsToSelector:@selector(taskViewController:didFinishWithReason:error:)]) {
[strongDelegate taskViewController:self didFinishWithReason:reason error:error];
}
}
Что цель хранения местной сильной переменной указывая на делегат перед вызовом его метод? Разве это не позволяет делегату освободиться от другого потока между проверкой respondsToSelector:
и вызовом метода? Может ли это вообще произойти?
Если это так, то почему вы хотите вызвать метод делегата? Почему бы не освободить его и выполнить no-op, который отправляет сообщение переменной nil?
Я думаю, что если делегат освободится перед вызовом responsesToSelector, вызов responsesToSelector вызовет исключение (EXC_BAD_ACCESS?). Поскольку этот метод применим только к NSObject. Но если это так, я думаю, что перед вызовом метода responsesToSelector необходимо выполнить проверку сильногоDelegate! = Nil. – Surely
Хотелось бы узнать об этом иначе, но я думаю, что это полная чушь. .delegate либо уже освобожден, либо нет, и ни один, ни другой, когда этот метод работает. Он не может быть освобожден во время выполнения этого метода. И никакое заклинание в начале, копируя указатель на переменную стека (которая по умолчанию по-прежнему сильно), изменяет эти условия. – danh
@zp_x: Я боюсь, что вы ошибаетесь, слабые переменные заполняются, когда они освобождаются, а отправка сообщений в переменные nil просто не работает. –