【问题标题】:Retain keyword not throwing compiler error in Xcode 4.6 ARC project?在 Xcode 4.6 ARC 项目中保留关键字不会引发编译器错误?
【发布时间】:2015-08-28 13:07:48
【问题描述】:

我刚刚在客户现场签订了一份新合同。

我正在着手开发一个由刚接触 Objective-C 的 Android 开发人员编写的应用原型。 (他已经离开了公司,所以不能问问题。)

该项目是使用 ARC 用 Objective-C 编写的。其中一个文件的属性声明为

@property (nonatomic, retain, readonly) <class> *<name>;

(其中&lt;class&gt;&lt;name&gt; 被替换为每个属性的实际类和属性名称。)

过去,当我尝试在 ARC 项目中包含手动引用计数代码时,编译器会在 retain 关键字上抛出错误。然而,在这个项目中,它并没有抱怨。

我检查了,该文件没有设置为使用手动引用计数进行编译。

我编辑了属性定义并将单词 retain 替换为 strong,这样也可以编译。

Apple 最近是否更改了编译器,以便 retain 是 ARC 中 strong 的同义词?相反,strong 在使用手动引用计数编译的文件中是 retain 的同义词吗?

如果是这样,此更改是何时进行的?

【问题讨论】:

  • @property (nonatomic, retain, readonly) *;在 ARC 项目中效果很好......另一个地方有错误

标签: ios objective-c xcode automatic-ref-counting


【解决方案1】:

好吧,它的文档记录并不特别好,但是ARC transitioning doc 声明:

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
@property(strong) MyClass *myObject;

注意单词同义词,这意味着retainstrong 属性的含义相同。

【讨论】:

  • 在混合使用不同内存管理语义的代码(手动引用计数应用程序中的 ARC 代码,反之亦然)时,我有强烈的记忆力,即使是模糊的,也会出现编译器错误。我在想什么那么呢?是实例变量上的__strong__retain 限定词吗?我很困惑...
  • 是的,大概就是这样。
【解决方案2】:

来自文档 Clang 3.8 文档Property declarations 部分:

retain 意味着 __strong 所有权。

据我所知,retain 在属性声明中一直是strong 的同义词。

这只是属性语句中的一个关键字,没有理由暗示这在其他用法中作为两者之间的一般等价物延续。它所做的就是让从 pre-ARC 到 ARC 的转换更容易一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2013-01-13
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多