Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone ARC“删除未使用的自动释放消息不安全”_Iphone_Objective C_Ios_Automatic Ref Counting - Fatal编程技术网

Iphone ARC“删除未使用的自动释放消息不安全”

Iphone 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;

在转换到ARC时,我遇到了以下编译器错误:删除未使用的自动释放消息是不安全的

如果我只是删除autorelease消息,obj将在getAutoreleasedObj的末尾立即释放,这将导致printObj崩溃。那么,如何处理自动释放的对象,并将以下代码转换为ARC

- (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];