释放由方法返回的对象

4

好的,我知道这个问题的答案应该是显而易见的,但我需要一点指引。

我发现自己写了不少遵循以下模式的方法:

-(NSThing*)myMethod{

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

我的问题是,如何处理这个对象的释放?显然我不能在方法内部释放它。

2个回答

13

通常你会将其设置为自动释放

-(NSThing*)myMethod{

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

嗨,我可以在这里做 {NSThing *thing = [[[NSthing alloc] init] autorelease];return thing;} 吗? - Naman

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。然而,如果你编写一个方法,该方法接受一个现有的对象并以某种方式修改它,则你不拥有该对象,也不负责自动释放返回的对象。(这样做实际上可能会在将来造成问题,当对象所属的自动释放池被清空时。)

另请参阅(感谢评论中的Peter和Quinn!):


从技术上讲,它应该是以“alloc”或“new”开头或包含“copy”的任何方法,而不是“init”,尽管alloc不可避免地后跟init,但并非所有的init都会跟随alloc。请参见http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html。 - Peter N Lewis
在注释中,在链接周围放置<和>会导致URL末尾多出一个转义字符。这是没有尖括号的相同URL:http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html - Quinn Taylor
如果参数是字面字符串,那么+stringWithString:通常会被简化,但对于+stringWithFormat:则不能这样做——该方法保证返回一个独立的NSString实例。 - Quinn Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接