我在Xcode 4.3中使用了“转换为Objective C ARC”选项,将在Xcode 4.0中启动的项目转换为使用ARC。在修复该工具发现的错误之后,我进入了迁移工具已删除所有发布消息以及在我的属性声明中保留属性的过程。所以现在我的所有属性都只有(非原子)属性。通过阅读文档,我仍然没有明确的答案。
所以我的问题是:如果你在属性声明中省略了关于setter语义的关键字(strong,weak,retain,assign),那么使用ARC时属性的默认属性是什么?
我在文档中发现默认属性属性为 assign 。但是,他们还说现在 ivars 的默认属性,如果省略它,则强。
为了更好地解释我的问题,这是一个例子。我头文件我们有声明:
@property (nonatomic) MyClass *objectToUse;
在我们的实施中我们只有
@synthesize objectToUse;
如果我们在内部写一些方法:
self.objectToUse = [[MyClass alloc] init];
我们创建了一个强(保留)或弱(分配)引用吗?如果我们改为写
objectToUse = [[MyClass alloc] init];
通过使用ivar,我们改变了有关对象保留政策的情况吗?在我看来,现在使用ARC,使用属性进行内存管理的最佳实践不再是相同的做法了。
答案 0 :(得分:16)
我已经开通了技术支持事件。工程师验证默认值已从“assign”更改为“strong”。原因正是您描述的不一致。现在ivars和@properties具有相同的默认值。
他说文件(以及某些人得到的警告)都是错误的并且将被修复。 (转换工具是正确的。)在完成之前,我会完全避免隐式默认。始终明确指定“强”,“弱”或“分配”。
编辑:clang documentation现在正式记录了此更改。
答案 1 :(得分:7)
默认关系类型仍为assign
,即弱参考。此外,在ARC模式下,编译器将在@synthesize
访问器时生成错误,除非您明确指定关系类型。
分配给self.objectToUse
和objectToUse
的区别在于第二种形式总是使用ARC来retain
或assign
,而第一种形式会使用{{1}如果您指定了copy
关系。