ARC迁移后更改属性和ivars

lgd*_*dev 12 objective-c automatic-ref-counting

我使用Xcode 4.3中的"Convert to Objective C ARC"选项将Xcode 4.0中启动的项目转换为使用ARC.在修复该工具发现的错误之后,我进入了迁移工具已删除所有发布消息以及在我的属性声明中保留属性的过程.所以现在我的所有属性都只有(非原子)属性.通过阅读文档,我仍然没有明确的答案.

所以我的问题是:如果在属性声明中省略了关于setter语义的关键字(strong,weak,retain,assign),使用ARC时属性的默认属性是什么?

我在文档中发现默认属性属性是assign.但是,他们还说现在ivars的默认属性,如果省略它,就很强大.

为了更好地解释我的问题,这是一个例子.我头文件我们有声明:

@property (nonatomic) MyClass *objectToUse;
Run Code Online (Sandbox Code Playgroud)

在我们的实施中,我们只有

@synthesize objectToUse;
Run Code Online (Sandbox Code Playgroud)

如果我们在内部写一些方法:

self.objectToUse = [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

我们创建了一个强大的(保留)或弱(分配)参考?如果我们改写

objectToUse = [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

通过使用ivar,我们改变了有关对象保留政策的情况吗?在我看来,现在使用ARC,使用属性进行内存管理的最佳实践不再是相同的做法.

nsc*_*hum 16

我已经开了一个技术支持事件.工程师验证默认值已从"assign"更改为"strong".原因正是您描述的不一致.现在ivars和@properties具有相同的默认值.

他说文件(以及一些人得到的警告)都是错误的并且将被修复.(转换工具是正确的.)在完成之前,我会完全避免隐式默认值.始终明确指定"强","弱"或"分配".

编辑:clang文档现在正式记录了这一变化.


Ste*_*mer 7

默认关系类型仍然是assign,即弱参考.此外,在ARC模式下,@synthesize除非您明确指定关系类型,否则编译器将在访问器时生成错误.

分配给self.objectToUse和之间的区别objectToUse是第二个表单将始终使用ARC retainassign,copy如果您指定了一个copy关系,将使用第一个表单.