仅限iOS5且启用ARC的项目在Xcode 4.3.1 beta上编译。在4.2.1上编译时。 LLVM会抛出这样的警告:
“ARC禁止合成Objective-C对象的属性 未指定的所有权或存储属性“
所以属性定义如下所示:
@property (nonatomic) NSObject* object
在Build Settings中启用了ARC。添加强大的属性会修复此警告,但这应该是默认对吗?
处理这些属性默认值的Xcode版本之间是否存在差异?
由于 岸堤
答案 0 :(得分:4)
这不是特定于测试版的Xcode 4.2.1具有相同的行为(测试版属于NDA,只能在苹果的开发者论坛中合法讨论):
“强”是ivar
的默认设置。对于ivars,如果您需要__unsafe_unretained
或__weak
,则必须指定。
在属性声明中指定属性始终是最佳做法。弹出最快的一个例子是UILabel
属性文本,定义为:
@property(nonatomic,copy) NSString *text; // default is nil
在这个示例中,copy
属性告诉我可以将NSMutableString
引用传递给标签,它将复制,我可以继续改变字符串,标签将保持不变。行为已明确界定。
我怀疑这是明确定义的行为,这是ARC编译器强制您指定存储属性的最主要原因。请记住,新的运行时无需为属性声明ivars,而@synthesize
用于访问器方法,可以想象,如果您不小心保留了委托,您将注意到属性声明。
同时考虑一个项目中的一些类可能被排除在ARC之外的可能性,在这些情况下内部实现对ARC完全不透明。