0

这是一个与 Objective-C 内存管理相关的问题。

关于内存管理页面上有一些示例

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

第二个

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

唯一的区别是在第一个示例中调用了初始化程序,而在第二个示例中调用了类工厂方法。

基本内存管理规则部分说,在alloc调用后我将拥有我分配的对象。因此,在第一个示例中,我分配了一个对象并同时对其进行了初始化。在此,我拥有该对象并且必须拥有release它。在第二个例子中我没有。但是工厂方法不是stringWithFormat:在一次调用中做同样的事情吗,我的意思是分配对象并初始化它?

所以主要问题是,为什么我不必在第二个示例中释放对象?实现类工厂方法时有什么特殊的内存管理规则吗?

4

3 回答 3

2

按照惯例,类工厂方法将返回一个位于自动释放池中的对象。它已经为您完成了 alloc、init、autorelease,就像在第一个示例中一样。除非您保留它,否则当池排空时,它将被释放。

于 2012-05-04T20:45:29.480 回答
1

在第二个示例中,您没有创建字符串。alloc您只能通过调用以、newcopy或开头的方法来创建对象mutableCopy

如果愿意,您可以通过调用 来获得所有权,retain但您也需要负责调用release。在这个例子中,没有必要。你不再需要这个字符串了。调用者用它做什么是他们的责任。

当像这样调用工厂方法时,您通常会收到一个自动释放的对象。但是你真的不需要考虑这个。因为没有创建它(因为没有使用以alloc, new,copymutableCopy它不会从你下面消失。由于它只是返回给调用者,因此本例中的答案是否定的。

于 2012-05-04T20:52:36.993 回答
0

没错,工厂方法在内部调用alloc,因此返回保留对象,但它将该对象添加到最近的自动释放池中,因此当该池被耗尽时,该对象将被释放。

于 2012-05-04T20:48:52.243 回答