Iphone ARC“删除未使用的自动释放消息不安全”
在转换到ARC时,我遇到了以下编译器错误:删除未使用的自动释放消息是不安全的 如果我只是删除autorelease消息,obj将在getAutoreleasedObj的末尾立即释放,这将导致printObj崩溃。那么,如何处理自动释放的对象,并将以下代码转换为ARCIphone ARC“删除未使用的自动释放消息不安全”,iphone,objective-c,ios,automatic-ref-counting,Iphone,Objective C,Ios,Automatic Ref Counting,在转换到ARC时,我遇到了以下编译器错误:删除未使用的自动释放消息是不安全的 如果我只是删除autorelease消息,obj将在getAutoreleasedObj的末尾立即释放,这将导致printObj崩溃。那么,如何处理自动释放的对象,并将以下代码转换为ARC - (MyClass *) getAutoreleasedObj { MyClass *obj = [[MyClass alloc] init]; [obj autorelease]; return obj;
- (MyClass *) getAutoreleasedObj {
MyClass *obj = [[MyClass alloc] init];
[obj autorelease];
return obj;
}
- (void) printObj {
NSLog(@"%@", [self getAutoreleasedObj];
}
你说:
如果我只是删除了autorelease消息,obj将在getAutoreleasedObj的末尾立即被释放
这是不正确的。由于方法getAutoreleasedObj的名称不符合alloc/init/copy/mutableCopy/new模式,ARC自动假定您希望自动删除obj
在getAutoreleasedObj的末尾,您不会耗尽任何autorelease池,因此不会释放obj
代码运行时,某些自动释放池处于活动状态。如果您没有手动设置自动释放池,那么活动池就是Cocoa的运行循环设置的池。在通过运行循环的每次循环结束时,该池将被排空
因此,除非您在某个地方设置了自己的池,否则在getAutoreleasedObj中创建的对象将一直存在到运行循环的当前迭代结束。您必须删除对autorelease的调用: printObj方法现在等效于以下内容:
- (void) printObj {
MyClass *obj = [self getAutoreleasedObj];
// At his point there is a reference to obj
NSLog(@"%@", obj);
// There are no references to obj now, ARC will take care of it.
}
我的意思是,对obj的有效引用将传递给NSLog,之后,将不再有其他对obj的引用。如前所述
在ARC中不需要自动释放。ARC会为你处理所有的事情,所以你不必担心。在ARC概述下:
您不必自动释放它,因为它是从函数返回的,ARC将隐式地使它自动释放并为您释放它 此代码:
-(id) getAutoReleasedObject
{
__autoreleasing MyClass *obj = [MyClass new];
return obj;
}
汇编如下:
-(id) getAutoReleasedObject
{
MyClass *obj = [MyClass new];
return [obj autorelease];
}
ARC标识方法族以确定何时插入版本。 以init、copy、mutableCopy、new开头的方法属于init族。ARC在调用方法中插入释放。在大多数情况下,不必从方法返回自动释放的对象。ARC智能地为您插入释放/保留。您可以通过使用NS\u RETURNS\u RETAINED/NS\u RETURNS\u NON\u RETAINED装饰您的方法来覆盖此行为
唯一需要自动释放的情况是通过回写指针返回数据。在您的情况下,您可以安全地删除autorelease调用。简单的答案是将函数的最后两行更改为:
[obj autorelease];
return obj;
到
ARC转换重写器本身不允许[x autorelease],因为它认为如果x不再被引用,这是危险的。因此,您基本上只需确保使用[x autorelease]的返回值,这在OPs案例中很容易做到。在ARC iirc中不需要autorelease。@LoganSerman那么在getAutoreleasedObj的末尾,obj已经发布了,我如何在printObj中使用它?什么意思是它已经发布了?ARC为您处理所有释放。它会在需要发布的时候发布,所以你不必担心。阅读ARC概述:感谢您的回答!我一直困惑的是,根据你给我的链接,obj的默认限定符是_____________________________________________?根据理查德的回答,这是必要的。正如他所说的那样,这将被隐含地添加进去。您不必自己添加它。我的理解是,如果不指定变量限定符,ARC将使其默认为_强,并导致崩溃。嗯,看来我错了。谢谢。如果我放弃自动释放怎么办?我测试过了,似乎删除自动删除不会引起问题。哦,我明白了,ARC足够聪明,可以添加自动删除而不是强自动删除。@lichen19853正确。ARC向从函数返回的对象添加_自动删除,除非用_属性指定!对不起,我只能发表一条评论,但我对你的答案投了赞成票。
[obj autorelease];
return obj;
return [obj autorelease];