Для поддержки iOS 4.3 используйте "назначить" вместо слабого, но Interface Builder использует unsafe_unretained?
Для поддержки iOS 4.3 с ARC, я думаю, что правильный путь заключается в использовании assign
:
@property (assign, nonatomic) UIView *view;
@property (assign, nonatomic) MYNode *node;
Это верно? Я также вижу следующее в документе Apple по переходу на ARC:
Для объявленных свойств вы должны использовать assign вместо слабого; для переменных вы должны использовать __unsafe_unretained вместо __weak.
Однако, если я использую текущий Xcode (4.4.1), меняя цель приложения Single View на 4.3, и перетаскиваю UIB-кнопку Ctrl на .h
файл для создания розетки, сгенерированный код:
@property (unsafe_unretained, nonatomic) IBOutlet UIButton *foo;
Почему разница и какой из них следует использовать?
2 ответа
Согласно 4.1.1. Объявления свойств в документации llvm "assign" и "unsafe_unretained" эквивалентны в объявлении свойств:
- Назначение подразумевает __unsafe_unretained владение.
- ...
- unsafe_unretained подразумевает __unsafe_unretained владение.
ДОБАВЛЕНО: В исходном коде clang http://clang.llvm.org/doxygen/SemaObjCProperty_8cpp_source.html вы найдете
00523 // 'unsafe_unretained' is alias for 'assign'.
00524 if (Attributes & ObjCDeclSpec::DQ_PR_unsafe_unretained)
00525 PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_assign);
Вы процитировали отрывок из ответа на вопрос "Какие классы не поддерживают слабые ссылки?" - на самом деле, я думаю, выдержка предназначена для применения только к классам, перечисленным в ответе.
Из того, что я читал раньше, когда я изучал ARC, нет никакой реальной разницы между unsafe_unretained
а также assign
,