Для поддержки 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,

Другие вопросы по тегам