这是与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:
在一次调用中是否做同样的事情,我的意思是分配对象并初始化它?
所以主要的问题是,为什么我不必在第二个例子中释放对象? 实现类工厂方法时是否有任何特殊的内存管理规则?
答案 0 :(得分:2)
按照惯例,类工厂方法将返回自动释放池中的对象。它已经为你完成了alloc,init,autorelease,就像在第一个例子中一样。除非您保留它,否则当池耗尽时,它将被释放。
答案 1 :(得分:1)
在第二个示例中,您没有创建字符串。您只能通过调用以alloc
,new
,copy
或mutableCopy
开头的方法来创建对象。
如果您愿意,您可以通过调用retain
获取所有权,但之后您还要负责调用release
。在这个例子中,没有必要。你不再需要字符串了。呼叫者对此负责的是他们的责任。
调用这样的工厂方法时,通常会收到一个自动释放的对象。但你真的不需要考虑这个问题。因为你没有创建它(因为你没有使用以alloc
,new
,copy
开头的方法,或mutableCopy
获取该字符串),您需要做的就是考虑保留计数增量 - 您是否需要保留它以防止它从您下面消失。由于它只是被返回给调用者,因此本例中的答案是否定的。
答案 2 :(得分:0)
你是对的,工厂方法在内部调用alloc
,因此返回保留对象,但它将该对象添加到最近的autorelease pool,所以当该池被耗尽时,对象将被释放。