objective-c - 从非ARC代码调用ARC方法

标签 objective-c ios automatic-ref-counting

我有一个使用ARC库的非ARC项目。我是否应该释放由库方法返回的对象感到困惑。这是一些例子:

- (void)test{
    LibObject* obj1 = [[LibObject alloc] init];
    LibObject* obj2 = [obj1 otherObj];

    [obj1 release]; //should I release it?
    [obj2 release]; //should I release it?
}

据我所知,如果对象位于自动释放池中,则应将其保留。否则,我应该释放它。

但是,the ARC document表示

从此类函数或方法返回时,ARC会在返回语句的评估点保留该值,然后保留所有本地作用域,然后平衡保留,同时确保该值跨越调用边界。在最坏的情况下,这可能涉及自动释放,但是调用者不得假定该值实际上在自动释放池中。

该文档是否暗示我由于不能假定对象已自动释放而应始终释放该对象?

最佳答案

请参阅“高级内存管理编程指南”中的Memory Management Policy:

您拥有创建的任何对象
您使用方法创建对象
其名称以“alloc”,“new”,“copy”或“mutableCopy”开头(对于
例如alloc,newObject或mutableCopy)。

您不得放弃不拥有的对象的所有权

这些规则与使用ARC编译的方法一致。
ARC documentation中,“3.2.2。保留的返回值”中描述了第一类方法的行为:

从此类函数或方法返回时,ARC保留该值
在评估返回声明时,...

这意味着调用者必须释放该对象。

第二类中的方法在“3.2.3。未保留的返回值”中描述:

从此类函数或方法返回时,ARC保留该值
在返回语句的评估点,然后将所有
本地范围,然后平衡保留...

这意味着调用者不得释放该对象。

因此,在您的示例中:

LibObject* obj1 = [[LibObject alloc] init];
LibObject* obj2 = [obj1 otherObj];
[obj1 release]; //should I release it? --> YES
[obj2 release]; //should I release it? --> NO

您拥有obj1,因为它是用alloc创建的,因此您必须释放obj1

您不拥有obj2,因此不得释放它。

注意:如果在代码上运行Xcode静态分析器,它将准确显示违反这些规则的位置。

关于objective-c - 从非ARC代码调用ARC方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13859068/

相关文章:

ios - 如何在 UIActivityViewController 模式中显示文件大小和类型

ios - 以编程方式从另一个应用程序下载内部应用程序

ios - 找不到框架错误 Xcode 8

ios - UIButton子类更改标题颜色,而无需使用setTitleColor(_,用于状态:) [Swift]

ios - 如何将 CososDenshion 添加到支持 ARC 的 iPhone 应用程序中?

objective-c - CHDataStructures 是否符合 ARC 标准?

objective-c - 我如何使用 MOgenerator 的 xmod?

ios - PFFile 中的图像将被上传以进行解析,而不是保存到本地数据存储中

iOS 应用程序外部主机

ios - Xcode 5和Cocos2d : Random Errors Like: 'No Known Class Method for Selector ' scene'?