2013-10-05 4 views
1

В примере яблоки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?

ответ

0

Означает ли это, weakMyController имеет сильную ссылку на него, так что будет, как weakMyController сохраняют кол + 1?

Счетчик сохранения для myController тот же для всех переменных, которые имеют ссылку. Это значение объекта, а не переменных, указывающих на него. И он сообщает runtime ho много сильных ссылок, указывающих на объект.

Таким образом, линия

MyViewController *strongMyController = weakMyController; 

будет увеличиваться, что подсчет на 1, и гарантировать, что до тех пор, как мы имеем, что переменная в области видимости, что контроллер представления не будет освобожден.

В большинстве случаев достаточно вызвать методы для слабого задания внутри блока (weakMyController в вашем примере). Я думаю, что в этом случае они используют сильную ссылку, потому что задействована анимация (поэтому диспетчер представлений должен существовать на протяжении анимации, что не гарантировалось бы, если бы мы использовали слабую ссылку).

Чтобы ответить на другую часть вашего вопроса, все сильные и слабые ссылки на объект сохраняют одно и то же значение (адрес памяти объекта). Разница между сильным и слабым - это то, что происходит, когда они получают свои ценности. В случае слабого задания счет сохранения остается неизменным, а при сильной ссылке он увеличивается.

+0

Спасибо, но не могли бы вы объяснить, почему это не вызовет цикл сохранения? Похоже, поскольку strongMyController вызовет цикл сохранения, потому что strongMyController теперь является владельцем слабогоMyController, который указывает на myController. – SukyaMaki

+0

Поскольку weakMyController никоим образом не увеличивает счет сохранения. Это та же самая причина, почему слабые делегаты не создают циклы сохранения. – MikeS

+1

Хороший вопрос! Цикл сохранения будет происходить, если в любом месте вашего блока у вас есть линия, использующая сильную ссылку на myController. Да, вы создаете новую сильную ссылку в блоке, но она создается только тогда, когда блок выполняется, и к тому моменту myController может перестать существовать, и тогда 'strongMyController' будет равен нулю. Таким образом, здесь нет цикла сохранения. – Macondo2Seattle

Смежные вопросы