我正在浏览Apple的Advanced Memory Management Programming Guide。
以下代码:
-(NSString *)fullName {
NSString *string = [NSString stringWithFormat:@"%@ %@",
self.firstName,
self.lastName];
return string;
}
遵循基本规则,您不拥有stringWithFormat:返回的字符串,因此您可以安全地从该方法返回字符串。
...因此,不必释放它。
指南另一部分的基本规则:
使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建对象
...这会让你成为拥有者)
那么,谁拥有该字符串?
答案 0 :(得分:2)
此时,自动释放池拥有该字符串。它最初是由Foundation框架创建的,它分配了对象,从而成为它的所有者。然后,在将对象返回到您的代码之前,基金会通过调用autorelease
将其所有权转移到自动释放池。
答案 1 :(得分:0)
使用stringWithFormat:时,调用者没有该对象的所有权。因此,您可以在不调用autorelease的情况下返回对象。如果您使用过initWithFormat :,则需要在返回之前自动释放该对象。
答案 2 :(得分:0)
“拥有”是一个糟糕的术语 - 在某些情况下是适当的,但不是一般的。真正的问题是:
1)在您不再需要访问该对象之前,您是否确定该对象将被retain
编辑?
2)当你不再需要release
时,你是否负责? (后一种属性可以被认为是“所有权”。)
在上面的例子中,对象是retain
,当应用程序“出现空气”时,它将是autorelease
d。因此,您不负责发布它,并且在调用您的方法(以及更长时间)期间将retain
,而不需要您付出更多努力。
答案 3 :(得分:0)
您拥有自己创建的对象(使用alloc / copy)或保留。
作为一个拇指规则,工厂方法返回的对象最有可能是自动释放的对象,而不需要释放它们
这解释了为什么你不应该释放从stringWithFormat
方法获得的NSString
以下更改将使字符串在第一种情况下拥有返回的对象。
string = [[NSString stringWithFormat:@"%@ %@",self.firstName,self.lastName] retain];
使用alloc / copy,您可以创建需要明确释放的对象 - 这解释了您的第二种情况。