strong / weak / keep / unsafe_unretained / assign
свойства для синтеза свойства: сохранить / присвоить
- сохранить – он сохраняется, старое значение освобождается и назначается
- присваивать – он присваивается
свойства для владения: IOS5 = сильный / слабый IOS4 = сохранить / небезопасно
-
сильный (iOS4 = сохранить) – я владею вами, вы не можете отменить это до того, как преуспеть с этим = сохранить
-
слабый (iOS4 = unsafe_unretained) – то же самое, что и назначение, отсутствие сохранения или освобождения
поэтому unsafe_unretained == assign?
@property (nonatomic, assign) NSArray * tmp;
равно ?
@property (nonatomic, unsafe_unretained) NSArray * tmp;
и наоборот ?
если да, то какой из них предпочтительнее, когда в iOS4, или почему существует (unsafe_unretained), если он точно такой же, как назначение?
и делегат в iOS4 должен быть небезопасным или не назначен?
- Добавить анимированное изображение Gif в Iphone UIImageView
- как я могу использовать анимацию в cocos2d?
- Как использовать VideoToolbox для распаковки видеоstreamа H.264
- Что такое NSCFDictionary?
- Как установить получателей для UIActivityViewController в iOS 6?
- Понимание подсчета ссылок с помощью Cocoa и Objective-C
- Чтение аудио сэмплов через AVAssetReader
- Воспроизведение музыки в фоновом режиме с помощью AVAudioplayer
если да, то какой из них предпочтительнее, когда в iOS4, или почему существует (unsafe_unretained), если он точно такой же, как назначение?
вы должны использовать unsafe_unretained
. Вы хотите показать читателю вашего кода, что вы действительно хотели использовать слабый, но это было невозможно, потому что слабый не доступен в версии iOS, которую вы хотите развернуть.
Однажды вы откажетесь от поддержки iOS4. И тогда вы можете просто найти unsafe_unretained
и заменить все из них weak
. Это будет намного проще, чем поиск assign
и вычислений, если вы на самом деле означали assign
или weak
Использование unsafe_unretained
создает более читаемый и понятный код, где намерения разработчика легче увидеть. В основном по той же причине мы используем YES
вместо 1
.
Есть несколько classов в Cocoa и Cocoa Touch, которые пока не поддерживают слабые ссылки, а это означает, что вы не можете объявить слабое свойство или слабую локальную переменную, чтобы отслеживать их. Эти classы include NSTextView, NSFont и NSColorSpace; для полного списка, см. Переход к примечаниям о выпуске ARC.
Если вам нужно использовать слабую ссылку на один из этих classов, вы должны использовать небезопасную ссылку. Для свойства это означает использование атрибута 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 ).