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