好的,我知道这个问题的答案应该是显而易见的,但我需要一点指引。
我发现自己写了不少遵循以下模式的方法:
-(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"];
你的代码可以采用类似的方法,考虑谁拥有你要返回的对象。在你提供的具体示例中,方法是alloc
和init
对象的方法,因此通常情况下,在你自己的方法中,你需要负责将其autorelease
。然而,如果你编写一个方法,该方法接受一个现有的对象并以某种方式修改它,则你不拥有该对象,也不负责自动释放返回的对象。(这样做实际上可能会在将来造成问题,当对象所属的自动释放池被清空时。)
另请参阅(感谢评论中的Peter和Quinn!):
+stringWithString:
通常会被简化,但对于+stringWithFormat:
则不能这样做——该方法保证返回一个独立的NSString实例。 - Quinn Taylor