要支持iOS 4.3,请使用“assign”而不是weak,但Interface Builder使用unsafe_unretained?

时间:2012-09-08 10:02:27

标签: objective-c automatic-ref-counting assign unsafe-unretained

为了支持带有ARC的iOS 4.3,我认为正确的方法是使用assign

@property (assign, nonatomic) UIView *view;
@property (assign, nonatomic) MYNode *node;

这是对的吗?我还在Apple's doc for Transitioning to ARC中看到以下内容:

  

对于声明的属性,您应该使用assign而不是weak;对于变量,您应该使用__unsafe_unretained而不是__weak。

但是,如果我使用当前的Xcode(4.4.1),将Single View应用程序目标更改为4.3,并按住Ctrl键将UIButton拖动到.h文件以创建插座,则生成的代码为:

@property (unsafe_unretained, nonatomic) IBOutlet UIButton *foo;

为什么应该使用差异和哪一个?

2 个答案:

答案 0 :(得分:3)

根据llvm文档中的4.1.1. Property declarations,“assign”和“unsafe_unretained”在属性声明中是等效的:

  • assign暗示__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);

答案 1 :(得分:1)

你引用了“哪些类不支持弱引用?”这一问题的回答摘录。 - 实际上,我猜,摘录仅适用于答案中列出的类。

根据我在学习ARC之前所读到的内容,unsafe_unretainedassign之间没有真正的区别。