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 должен быть небезопасным или не назначен?
Ответы
Ответ 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).