Насколько я знаю, 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
переменные и когда они обнуляются.