1

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

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

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

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

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

4

1 回答 1

2

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

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

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

在第二个示例中,该findRandomName方法不获取对象的所有权(因为它调用的方法不包含、 或alloc名称new)所以它不应该是对象。copymutableCopyrelease

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

您拥有您创建的任何对象

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

于 2012-10-29T00:02:38.830 回答