Objective-C .mm在初始化器和类工厂方法中

时间:2012-05-04 20:39:02

标签: objective-c factory

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

About Memory Management页面上有一些例子

- (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:在一次调用中是否做同样的事情,我的意思是分配对象并初始化它?

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

如果您愿意,您可以通过调用retain获取所有权,但之后您还要负责调用release。在这个例子中,没有必要。你不再需要字符串了。呼叫者对此负责的是他们的责任。

调用这样的工厂方法时,通常会收到一个自动释放的对象。但你真的不需要考虑这个问题。因为没有创建它(因为没有使用以allocnewcopy开头的方法,或mutableCopy获取该字符串),您需要做的就是考虑保留计数增量 - 您是否需要保留它以防止它从您下面消失。由于它只是被返回给调用者,因此本例中的答案是否定的。

答案 2 :(得分:0)

你是对的,工厂方法在内部调用alloc,因此返回保留对象,但它将该对象添加到最近的autorelease pool,所以当该池被耗尽时,对象将被释放。