Objective c cocoa内存管理问题

Objective c cocoa内存管理问题,objective-c,c,cocoa,memory-management,Objective C,C,Cocoa,Memory Management,我在和一个朋友争论,他说我必须把autorelase放在这里: NSURL *url = [[NSURL URLWithString:@"http://origin-www.metrolyrics.com/api/widgets/mac/seeker.php"] autorelease]; 但是当对象从NSURL类方法发送给我时,它不是自动释放的吗?谢谢。你说得对。你没有分配或复制一个对象,所以你必须释放它。只需在没有自动释放的情况下使用代码即可。;-) 您使用的类方法如下所示:(通常是这样。

我在和一个朋友争论,他说我必须把autorelase放在这里:

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

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

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

您使用的类方法如下所示:(通常是这样。我们不知道它,因为Apple不共享代码。)


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

您使用的类方法如下所示:(通常是这样。我们不知道它,因为Apple不共享代码。)

这是规则:

如果调用返回对象的方法并执行以下操作:

  • new开始
  • 以alloc开头
  • 是否保留
    retain
  • 包含
    副本
然后您负责释放(或自动释放)返回的对象。如果文档中另有说明,则情况就不会如此。您还可以在头文件中看到,该方法使用
NS\u RETURNS\u RETAINED
宏进行了注释。(头文件计为文档)

记住这一点的一个简单方法是“NARC”(新的alloc retain copy)

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

这是规则:

如果调用返回对象的方法并执行以下操作:

  • new开始
  • 以alloc开头
  • 是否保留
    retain
  • 包含
    副本
然后您负责释放(或自动释放)返回的对象。如果文档中另有说明,则情况就不会如此。您还可以在头文件中看到,该方法使用
NS\u RETURNS\u RETAINED
宏进行了注释。(头文件计为文档)

记住这一点的一个简单方法是“NARC”(新的alloc retain copy)


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

+1更明确地说,你不能在此处调用
自动释放。它不是可选的;这是不允许的。上面的代码几乎肯定会崩溃。+1为了更明确,您不能在此处调用
autorelease
。它不是可选的;这是不允许的。上面的代码几乎肯定会崩溃。让你的朋友把20美元放在他嘴里。然后按他的方式编码,看着它崩溃。使用Build&Analyze命令保存他的账单。让你的朋友把20美元放在他嘴边。然后按他的方式编码,看着它崩溃。使用Build&Analyze命令并保留他的账单。
+(id)URLWithString:(NSString *)aString {
    return [[[self alloc] initWithString:aString] autorelease];
}