2011-03-12 57 views
1

我与一个朋友争论谁说,我已经把这里autorelase:可可内存管理的问题

NSURL *url = [[NSURL URLWithString:@"http://origin-www.metrolyrics.com/api/widgets/mac/seeker.php"] autorelease]; 

但不是当它从NSURL类的方法发送给我自动自动释放对象?谢谢。

+1

让你的朋友把20美元的地方放在嘴里。然后按照他的方式编码并观看它的崩溃。使用Build&Analyze命令并保存账单。 – Caleb 2011-03-12 21:02:54

回答

4

你说得对。你没有不是分配或复制一个对象,所以你做不是必须释放它。只需使用你的代码而不需要autorelease。 ;-)

类方法你用过这个样子的:(通常它我们可以不知道,因为苹果并没有共享代码。)

+(id)URLWithString:(NSString *)aString { 
    return [[[self alloc] initWithString:aString] autorelease]; 
} 
+0

+1为了更加明确,你**不能**在这里调用'autorelease'。它不是可选的;这是不允许的。上面的代码几乎肯定会崩溃。 – 2011-03-12 18:53:19

5

这是规则:

如果调用返回的对象和方法:

  • 开始new
  • 开始与alloc
  • retain
  • 包含copy

那么你是负责释放(或自动释放)返回的对象。 只有这种情况并非如此,如果文档另有说明。您也可以在头文件中看到该方法用NS_RETURNS_RETAINED宏注释。 (头文件计为文档)

一个简单的方法来记住这是“NARC”(新分配保留复制)。

在你的榜样,因为URLWithString:newalloc开始,不含copy,而不是retain,那么你不得释放返回的对象。这样做违反了内存管理准则,并会导致你的应用程序崩溃(除非你在其他地方做了一些愚蠢的事情)。