Подтвердить что ты не робот

Strong/weak/keep/unsafe_unretained/assign

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

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

свойства для собственности: IOS5 = сильный/слабый IOS4 = сохранить/небезопасно_получить

  • strong (iOS4 = сохранить) - я владелец, вы не можете удалить этот перед тем, как прицелиться с этим = сохранить

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

так unsafe_unretained == присваивать?

@property (nonatomic, assign) NSArray * tmp;

равно?

@property (nonatomic, unsafe_unretained) NSArray * tmp;

и наоборот?

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Есть несколько классов в Cocoa и Cocoa 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).