内存管理何时自动发布返回值

时间:2012-10-28 23:59:55

标签: objective-c memory-management

我一直在网上搜索并阅读很多帖子,但没有人能解释我这是如何运作的。我知道约定说任何方法必须返回一个自动释放的对象(alloc,new,copy和mutableCopy除外)所以这样的事情很好:

-(MyClass*)findRandomName { return [[[MyClass alloc] initWithString:@"Something"] autorelease]; }

我的问题是,如果我使用便捷方法或类似的东西,我是否应该在返回值上调用autorelease?像这里:

-(MyClass*)findRandomName { return [[MyClass startFromString:@"Something"] autorelease]; }

为什么,或为什么不呢?谢谢你提前。

1 个答案:

答案 0 :(得分:2)

您的第一个示例不正确,因为它应在致电[MyClass alloc]之前致电initWithString,例如:

-(MyClass*)findRandomName { 
    return [[[MyClass alloc] initWithString:@"Something"] autorelease]; 
}

在第二个示例中,您应该 autorelease该对象。 startFromString方法应该已经autorelease该对象,如果您再次autorelease,则会释放该对象。

在第二个示例中,findRandomName方法不取得对象的所有权(因为它调用的方法不包含allocnewcopy或{{ 1}}在名称中)所以它不应该mutableCopy对象。

你的声明“约定说任何方法必须返回一个自动释放的对象(init,new和copy除外)”并不完全正确。 memory management policy说:

  

您拥有自己创建的任何对象

     

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