我一直在网上搜索并阅读很多帖子,但没有人能解释我这是如何运作的。我知道约定说任何方法必须返回一个自动释放的对象(alloc,new,copy和mutableCopy除外)所以这样的事情很好:
-(MyClass*)findRandomName { return [[[MyClass alloc] initWithString:@"Something"] autorelease]; }
我的问题是,如果我使用便捷方法或类似的东西,我是否应该在返回值上调用autorelease?像这里:
-(MyClass*)findRandomName { return [[MyClass startFromString:@"Something"] autorelease]; }
为什么,或为什么不呢?谢谢你提前。
答案 0 :(得分:2)
您的第一个示例不正确,因为它应在致电[MyClass alloc]
之前致电initWithString
,例如:
-(MyClass*)findRandomName {
return [[[MyClass alloc] initWithString:@"Something"] autorelease];
}
在第二个示例中,您应该 不 autorelease
该对象。 startFromString
方法应该已经autorelease
该对象,如果您再次autorelease
,则会释放该对象。
在第二个示例中,findRandomName
方法不取得对象的所有权(因为它调用的方法不包含alloc
,new
,copy
或{{ 1}}在名称中)所以它不应该mutableCopy
对象。
你的声明“约定说任何方法必须返回一个自动释放的对象(init,new和copy除外)”并不完全正确。 memory management policy说:
您拥有自己创建的任何对象
使用名称以“alloc”开头的方法创建对象, “new”,“copy”或“mutableCopy”(例如,alloc,newObject或 mutableCopy)。