【问题标题】:Change with properties and ivars after ARC migrationARC 迁移后随属性和 ivars 的变化
【发布时间】:2012-03-06 11:50:38
【问题描述】:

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

所以我的问题是:如果你在属性声明中省略了关于 setter 语义(强、弱、保留、分配)的关键字,那么使用 ARC 时属性的默认属性是什么?

我在文档中发现默认属性属性是assign。但是,他们也说现在 ivars 的默认属性是 strong

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

@property (nonatomic) MyClass *objectToUse;

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

@synthesize objectToUse;

如果我们再写一些方法:

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

我们是否创建了强(保留)或弱(分配)引用?如果我们改为写

objectToUse = [[MyClass alloc] init];

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

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

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

    他说文档(以及一些人收到的警告)都是错误的,将予以修复。 (转换工具是正确的。)在此之前,我会完全避免隐式默认。始终明确指定“强”、“弱”或“分配”。

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

    【讨论】:

      【解决方案2】:

      默认关系类型仍然是assign,即弱引用。此外,在 ARC 模式下,除非您明确指定关系类型,否则编译器会在 @synthesizeing 访问器时产生错误。

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

      【讨论】:

      • 鉴于 ARC 迁移从他的属性声明中删除了 retain 属性,是否有可能从 Xcode 4.3 开始默认更改为 strong?我现在没有电脑可以测试它,但这不会让我感到惊讶。
      • 这实际上让我感到困惑,因为所有retain 属性都被 ARC 删除,所有属性都具有assign(默认情况下),这意味着在 ARC 迁移之后你必须经历所有属性声明并添加 strong 属性以具有相同的行为。有意思的是assign属性的delegate改为unsafe_unretained,这很好,但是retain有没有可能不自动改为strong
      • 对我来说看起来像是迁移器中的一个错误。我似乎记得我的项目 retain 属性在 XCode 4.2 中被转换为 strong
      • 确实如此。转换后strong 仍为strong,但retain 被删除。绝对听起来像一个错误。
      • 问题已得到解答,所以我将在此处注意说明混淆是由可能的错误引起的,该错误被视为 Xcode 4.3 没有放置strong 属性在 ARC 迁移之前具有 retain 属性的属性上,但只是删除 retain 属性并保留这些属性的默认值 assign,因此您必须检查迁移后手动设置属性。这发生在 4.0 到 4.3 的项目迁移中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      相关资源
      最近更新 更多