2012-02-13 97 views
3

这是一个仅适用于iOS5并支持ARC的Xcode 4.3.1 beta测试版项目。在4.2.1编译时。 LLVM是投掷警告这样的:Xcode 4.2.1 ARC问题

“ARC不允许对合成一个Objective-C对象的属性与 不明所有权或存储属性”

所以属性定义是这样的:

@property (nonatomic) NSObject* object 

ARC在Build Settings中启用。添加一个强大的属性修复了这个警告,但这应该是默认对不对?

Xcode版本在处理这些属性默认值时有区别吗?

感谢 安迪

+0

So Xcode 4.3发布。所以属性定义不需要存储属性。强是默认的,下面的工作没有问题。 '@property(nonatomic)NSObject * object' – abs 2012-02-20 09:55:50

回答

4

这不是测试特定的Xcode 4.2.1具有相同的行为(测试版是在保密协议,只能依法在苹果的开发者论坛中讨论):

强是默认设置为ivar s。对于ivars,如果你想__unsafe_unretained__weak你必须指定。

在属性声明中指定属性一直是最佳实践。弹出最快想到的例子是UILabel属性文本,定义为:

@property(nonatomic,copy) NSString *text; // default is nil 

在这个例子中copy属性告诉我,我可以通过一个NSMutableString参考标签,它将使一个副本,我可以继续突变字符串,标签将保持不变。行为是明确的。

我怀疑这是明确定义的行为,这是ARC编译器强制您指定存储属性的最主要原因。请记住,新的运行时消除了为属性声明ivars和为存取器方法声明@synthesize,可以想象的是,如果您意外地保留了一个委托,属性声明是您将注意到的唯一一点。

另外考虑一个项目中的几个类可能已经被排除在ARC之外的可能性,在这些情况下,内部实现对ARC来说是完全不透明的。