首页 文章

ARC迁移后更改属性和ivars

提问于
浏览
12

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

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

我在文档中发现默认属性属性是 assign . 但是,他们还说现在_1124447_的默认属性(如果省略它)是 strong .

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

@property (nonatomic) MyClass *objectToUse;

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

@synthesize objectToUse;

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

self.objectToUse = [[MyClass alloc] init];

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

objectToUse = [[MyClass alloc] init];

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

2 回答

  • 16

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

    他说文件(以及一些人得到的警告)都是错误的并且将被修复 . (转换工具是正确的 . )在完成之前,我会完全 avoid the implicit default . 始终明确指定"strong","weak"或"assign" .

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

  • 7

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

    分配给 self.objectToUseobjectToUse 之间的区别在于第二种形式将始终使用ARC到 retainassign ,而如果您指定 copy 关系,则第一种形式将使用 copy .

相关问题