好的,我知道这个问题的答案应该很明显,但我需要朝着正确的方向努力。
我发现自己编写了大量遵循以下模式的方法:
-(NSThing*)myMethod{
NSThing *thing = [[NSthing alloc] init];
// do some stuff with the thing
return thing;
}
我的问题是,我该如何处理这个对象的释放?显然我不能在方法中释放它。
好的,我知道这个问题的答案应该很明显,但我需要朝着正确的方向努力。
我发现自己编写了大量遵循以下模式的方法:
-(NSThing*)myMethod{
NSThing *thing = [[NSthing alloc] init];
// do some stuff with the thing
return thing;
}
我的问题是,我该如何处理这个对象的释放?显然我不能在方法中释放它。
通常你会自动释放它
-(NSThing*)myMethod{
NSThing *thing = [[NSthing alloc] init];
// do some stuff with the thing
return [thing autorelease];
}
正如newacct 所说,自动发布是摆脱这种情况的简单方法。但是,您应该考虑要返回的对象的“所有权”。
在 Objective-C 中,一般的经验法则是,任何带有alloc
、new
或copy
在其名称中的方法都会返回一个不自动释放的对象,而其他方法(如类方法)会预先自动释放要返回的对象。所以这三个在自动释放方面是不等价的(尽管编译器可能会做一些魔术并将它们全部减少为字符串常量):
// Autoreleased
NSString *string1 = [NSString stringWithString:@"aString"];
NSString *string2 = [[[NSString alloc] initWithString:@"aString"] autorelease];
// NOT autoreleased
NSString *string3 = [[NSString alloc] initWithString:@"aString"];
您的代码可以采用类似的方法,您可以在其中考虑谁拥有您要返回的对象。在您提供的特定示例中,该方法是对象的 onealloc
和init
ing,因此通常您负责autorelease
在自己的方法中对它进行 ing [原文如此]。但是,如果您要编写一个采用预先存在的对象并以某种方式对其进行修改的方法,您将不会拥有该对象,也不会负责自动释放返回的对象。(当对象所属的自动释放池耗尽时,这样做实际上可能会导致问题。)
另请参阅(感谢评论中的 Peter 和 Quinn!):