我与一个朋友争论谁说,我已经把这里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类的方法发送给我自动自动释放对象?谢谢。
你说得对。你没有不是分配或复制一个对象,所以你做不是必须释放它。只需使用你的代码而不需要autorelease。 ;-)
类方法你用过这个样子的:(通常它我们可以不知道,因为苹果并没有共享代码。)
+(id)URLWithString:(NSString *)aString {
return [[[self alloc] initWithString:aString] autorelease];
}
+1为了更加明确,你**不能**在这里调用'autorelease'。它不是可选的;这是不允许的。上面的代码几乎肯定会崩溃。 – 2011-03-12 18:53:19
这是规则:
如果调用返回的对象和方法:
new
alloc
retain
copy
那么你是负责释放(或自动释放)返回的对象。 只有这种情况并非如此,如果文档另有说明。您也可以在头文件中看到该方法用NS_RETURNS_RETAINED
宏注释。 (头文件计为文档)
一个简单的方法来记住这是“NARC”(新分配保留复制)。
在你的榜样,因为URLWithString:
不new
或alloc
开始,不含copy
,而不是retain
,那么你不得释放返回的对象。这样做违反了内存管理准则,并会导致你的应用程序崩溃(除非你在其他地方做了一些愚蠢的事情)。
让你的朋友把20美元的地方放在嘴里。然后按照他的方式编码并观看它的崩溃。使用Build&Analyze命令并保存账单。 – Caleb 2011-03-12 21:02:54