сильный / слабый / сохранить / unsafe_unretained / assign - PullRequest
36 голосов
/ 20 марта 2012

свойства для синтеза свойства: сохранить / назначить

  • сохранить - оно сохраняется, старое значение освобождается и ему назначается
  • назначать - оноприсваивается только

свойства для владения: IOS5 = сильный / слабый IOS4 = сохранить / unsafe_unretained

  • сильный (iOS4 = сохранить)- Я владелец, вы не можете освободить это до того, как прицельтесь хорошо с этим = сохранить

  • слабый (iOS4 = unsafe_unretained) - то же самое, что назначить, не сохранять или выпускать

so unsafe_unretained == назначить?

@property (nonatomic, assign) NSArray * tmp;

равно?

@property (nonatomic, unsafe_unretained) NSArray * tmp;

и наоборот?

, если да, какой предпочитать в iOS4, или почему (unsafe_unretained), если он точно такой же, как assign?

а делегат в iOS4 должен быть unsafe_unretained или назначить?

Ответы [ 2 ]

47 голосов
/ 20 марта 2012

если да, какой предпочитать в iOS4, или почему (unsafe_unretained), если он точно такой же, как assign?

вы должны использовать unsafe_unretained.Вы хотите показать читателю своего кода, что вы на самом деле хотели использовать слабую версию, но это было невозможно, поскольку слабая версия недоступна в той версии iOS, которую вы хотите развернуть.

Однажды вы перестанете поддерживать iOS4.И тогда вы можете просто найти unsafe_unretained и заменить их всех на weak.Это будет намного проще, чем искать assign и выяснить, действительно ли вы имели в виду assign или weak

Использование unsafe_unretained создает более читабельный и понятный код, где намерения разработчикалегче увидеть.В основном по той же причине мы используем YES вместо 1.

3 голосов
/ 22 ноября 2013

В Какао и Какао Touch есть несколько классов, которые еще не поддерживают слабые ссылки, что означает, что вы не можете объявить слабое свойство или слабую локальную переменную, чтобы отслеживать их. Эти классы включают NSTextView, NSFont и NSColorSpace; полный список см. в разделе «Переход к примечаниям к выпуску ARC».

Если вам нужно использовать слабую ссылку на один из этих классов, вы должны использовать небезопасную ссылку. Для свойства это означает использование атрибута unsafe_unretained:

 @property (unsafe_unretained) NSObject *unsafeProperty;

Для переменных вам нужно использовать __unsafe_unretained:

NSObject * __unsafe_unretained unsafeReference;

Небезопасная ссылка похожа на слабую ссылку в том, что она не поддерживает связанный объект, но он не будет установлен равным нулю, если целевой объект освобожден. Это означает, что у вас останется висячий указатель на память, изначально занятая освобожденным объектом, отсюда и термин «небезопасный». Отправка сообщения висячему указателю приведет к сбою.

Предоставлено Apple (https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html).

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...