Правильное использование ARC (Автоматический подсчет ссылок)? - PullRequest
2 голосов
/ 29 января 2012

Правильно ли при создании свойств заменять все retains на strong и все assigns на weak?

Я перехожу на ARC, какие-нибудь полезные советы?

Ответы [ 3 ]

4 голосов
/ 29 января 2012

Чтение Переход к примечаниям к выпуску ARC

Используйте руководство Xcode: Edit> Refactor> Convert to Objective-C ARC.

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

Обратите внимание, что правила предварительной проверки более жесткие, чем обычные настройки сборки.

2 голосов
/ 27 января 2013

Насколько я знаю, strong и retain являются синонимами, поэтому они точно одинаковы.
Редактировать: Также unsafe_unretained является синонимом assign, как указано nielsbot .

Тогда weak почти как assign, но автоматически устанавливается равным nil после того, как объект, на который он указывает, освобожден.

Это означает, что вы можете просто заменить их.

Однако есть один особый случай, с которым я столкнулся, когда мне пришлось использовать assign, а не weak. Допустим, у нас есть два свойства delegateAssign и delegateWeak. В обоих хранится наш делегат, который владеет нами, имея единственную сильную ссылку. Делегат освобождается, поэтому также вызывается наш метод -dealloc.

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething];
    [delegateAssign doSomething];
}

Делегат уже находится в процессе освобождения, но все еще не полностью освобожден. Проблема в том, что weak ссылки на него уже аннулированы! Свойство delegateWeak содержит ноль, но delegateAssign содержит действительный объект (со всеми свойствами, уже освобожденными и аннулированными, но все еще действительными). *

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething]; // Does nothing, already nil.
    [delegateAssign doSomething]; // Successful call.
}

Это особый случай, но он показывает нам, как работают эти weak переменные и когда они обнуляются.

1 голос
/ 30 января 2012

Короткий ответ - да. strong является ARC-эквивалентом retain, а weak является эквивалентом assign, только оно также обнуляется (устанавливает указатель на nil, если объект освобожден, предотвращая возможные сбои EXC_BAD_ACCESS) так что это даже лучше, чем assign. Страница Переход к примечаниям к выпуску ARC , как уже упоминалось, предоставляет дополнительные сведения, если вам интересно.

...