可可记忆管理问题

时间:2011-03-12 18:44:47

标签: objective-c c cocoa memory-management

我和一位朋友发生争执,他说我必须把autorelase放在这里:

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

但是当从NSURL类方法发送给我时,对象是否自动自动释放?感谢。

2 个答案:

答案 0 :(得分:5)

这是规则:

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

  • new
  • 开头
  • alloc
  • 开头
  • retain
  • 包含copy

然后您负责释放(或自动释放)返回的对象。如果文档另有说明,则时间不会出现这种情况。您还可以在头文件中看到该方法使用NS_RETURNS_RETAINED宏进行注释。 (头文件计为文档)

记住这个的简单方法是“NARC”(new-alloc-retain-copy)。

在您的示例中,由于URLWithString:不是以newalloc开头,不包含copy,而不是retain,因此您< strong>一定不能释放返回的对象。这样做违反了内存管理准则,会导致您的应用崩溃(除非您在其他地方做一些愚蠢的事情)。

答案 1 :(得分:4)

你是对的。你做了分配或复制一个对象,所以你必须释放它。只需在没有自动释放的情况下使用您的代码。 ; - )

您使用的Class方法如下所示:(通常情况确实如此。我们无法知道它,因为Apple不共享代码。)

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