我一直在网上搜索并阅读了许多帖子,但还没有人向我解释这到底是如何工作的。我知道约定说任何方法都必须返回一个自动释放的对象(除了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
方法不拥有对象的所有权(因为它调用的方法名称中不包含alloc
、new
、copy
或mutableCopy
),所以它不应该release
对象。
您所说的"约定说任何方法都必须返回一个自动释放的对象(init、new和copy除外)"并不完全正确。内存管理策略说:
您拥有您创建的任何对象
使用名称以"alloc"开头的方法创建对象,"new"、"copy"或"mutableCopy"(例如,alloc、newObject或mutableCopy)。