我和一位朋友发生争执,他说我必须把autorelase放在这里:
NSURL *url = [[NSURL URLWithString:@"http://origin-www.metrolyrics.com/api/widgets/mac/seeker.php"] autorelease];
但是当从NSURL类方法发送给我时,对象是否自动自动释放?感谢。
答案 0 :(得分:5)
这是规则:
如果调用返回对象的方法并且:
new
alloc
retain
copy
然后您负责释放(或自动释放)返回的对象。如果文档另有说明,则仅时间不会出现这种情况。您还可以在头文件中看到该方法使用NS_RETURNS_RETAINED
宏进行注释。 (头文件计为文档)
记住这个的简单方法是“NARC”(new-alloc-retain-copy)。
在您的示例中,由于URLWithString:
不是以new
或alloc
开头,不包含copy
,而不是retain
,因此您< strong>一定不能释放返回的对象。这样做违反了内存管理准则,会导致您的应用崩溃(除非您在其他地方做一些愚蠢的事情)。
答案 1 :(得分:4)
你是对的。你做了不分配或复制一个对象,所以你不必须释放它。只需在没有自动释放的情况下使用您的代码。 ; - )
您使用的Class方法如下所示:(通常情况确实如此。我们无法知道它,因为Apple不共享代码。)
+(id)URLWithString:(NSString *)aString {
return [[[self alloc] initWithString:aString] autorelease];
}