内存管理何时自动释放返回值



我一直在网上搜索并阅读了许多帖子,但还没有人向我解释这到底是如何工作的。我知道约定说任何方法都必须返回一个自动释放的对象(除了alloc、new、copy和mutableCopy),所以这样的东西很好:

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

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

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

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

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

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

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

在第二个示例中,findRandomName方法不拥有对象的所有权(因为它调用的方法名称中不包含allocnewcopymutableCopy),所以它不应该release对象。

您所说的"约定说任何方法都必须返回一个自动释放的对象(init、new和copy除外)"并不完全正确。内存管理策略说:

您拥有您创建的任何对象

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

最新更新