Objective-C:基本内存管理。对象的所有权?

时间:2011-12-22 19:43:34

标签: objective-c memory-management

我正在浏览Apple的Advanced Memory Management Programming Guide

以下代码:

-(NSString *)fullName {
    NSString *string = [NSString stringWithFormat:@"%@ %@",
                                                  self.firstName,
                                                  self.lastName];
    return string;
}
  

遵循基本规则,您不拥有stringWithFormat:返回的字符串,因此您可以安全地从该方法返回字符串。

...因此,不必释放它。

指南另一部分的基本规则:

  

使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建对象

...这会让你成为拥有者)

那么,谁拥有该字符串?

4 个答案:

答案 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,您可以创建需要明确释放的对象 - 这解释了您的第二种情况。

相关问题