释放方法返回的对象

时间:2009-08-09 04:44:02

标签: objective-c memory-management autorelease

好的,我知道这个问题的答案应该是显而易见的,但我需要向正确的方向努力。

我发现自己编写了大量遵循以下模式的方法:

-(NSThing*)myMethod{

  NSThing *thing = [[NSthing alloc] init];
  // do some stuff with the thing
  return thing;
}

我的问题是,如何处理此对象的发布?显然我无法在方法中释放它。

2 个答案:

答案 0 :(得分:13)

通常你会自动发布它

-(NSThing*)myMethod{

  NSThing *thing = [[NSthing alloc] init];
  // do some stuff with the thing
  return [thing autorelease];
}

答案 1 :(得分:5)

正如newacct所说,

自动释放是摆脱这种情况的简单方法。但是,您应该考虑您要返回的对象的“所有权”。

在Objective-C中,一般的经验法则是,名称中带有allocnewcopy的任何方法都会返回一个未自动释放的对象,而其他方法则是(像类方法一样)预先自动释放要返回的对象。所以这三个在自动释放方面并不相同(尽管编译器可能会做一些魔法并将它们全部减少为字符串常量):

// Autoreleased
NSString *string1 = [NSString stringWithString:@"aString"];
NSString *string2 = [[[NSString alloc] initWithString:@"aString"] autorelease];

// NOT autoreleased
NSString *string3 = [[NSString alloc] initWithString:@"aString"];

您的代码可以采用类似的方法,您可以考虑谁拥有您要返回的对象。在您提供的具体示例中,该方法是对象的allocinit,因此通常您需要在自己的方法中对autorelease [sic]负责。但是,如果您要编写一个获取预先存在的对象并以某种方式修改它的方法,那么您将不会拥有该对象,也不会负责自动释放返回的对象。 (当对象所属的自动释放池耗尽时,这样做实际上可能导致问题。)

另见(感谢Peter和Quinn的评论!):