В примере яблокиARC собственности с сильными и слабыми ссылками
MyViewController *myController = [[MyViewController alloc] init…];
MyViewController * __weak weakMyController = myController;
myController.completionHandler = ^(NSInteger result) {
MyViewController *strongMyController = weakMyController;
if (strongMyController) {
[strongMyController dismissViewControllerAnimated:YES completion:nil];
}
else {
// Probably nothing...
}
};
Что здесь происходит? Я смущен: MyViewController * strongMyController = weakMyController;
Означает ли это, что weakMyController имеет сильную ссылку на него, поэтому он будет похож на keepMyController's count count + 1? Что происходит, когда вы создаете сильную ссылку на слабый iVar?
Спасибо, но не могли бы вы объяснить, почему это не вызовет цикл сохранения? Похоже, поскольку strongMyController вызовет цикл сохранения, потому что strongMyController теперь является владельцем слабогоMyController, который указывает на myController. – SukyaMaki
Поскольку weakMyController никоим образом не увеличивает счет сохранения. Это та же самая причина, почему слабые делегаты не создают циклы сохранения. – MikeS
Хороший вопрос! Цикл сохранения будет происходить, если в любом месте вашего блока у вас есть линия, использующая сильную ссылку на myController. Да, вы создаете новую сильную ссылку в блоке, но она создается только тогда, когда блок выполняется, и к тому моменту myController может перестать существовать, и тогда 'strongMyController' будет равен нулю. Таким образом, здесь нет цикла сохранения. – Macondo2Seattle