Objective c cocoa内存管理问题
我在和一个朋友争论,他说我必须把autorelase放在这里: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类方法发送给我时,它不是自动释放的吗?谢谢。你说得对。你没有分配或复制一个对象,所以你必须释放它。只需在没有自动释放的情况下使用代码即可。;-) 您使用的类方法如下所示:(通常是这样。
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];
}