gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:58:14 29 4
gpt4 key购买 nike

我有一个使用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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com