这是一个与Objective-C内存管理有关的问题。Objective-C .mm in initializer and class factory method
在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:
在一次调用中做了同样的事情,我的意思是分配对象并初始化它?
所以主要问题是,为什么我不必在第二个示例中释放对象? 在实现类工厂方法时是否有任何特殊的内存管理规则?
p.s.所有这些基本上都是随着ARC的引入而开展的。你可能会更好地阅读。在ARC下,你简单地忽略诸如retain,release,autorelease之类的东西(试图调用这些方法会导致编译错误),并且知道一切都会正常工作。 – ericg
答案基本上是正确的,只是他们声明从类工厂方法返回的对象是autoreleased。重要的是你不拥有它,没有权利或责任来释放它。它可能会或可能不会被自动释放。可能会有完全不同的内存管理方案。它可能会返回一个单身人士。它可能会返回一个永久性的共享值对象(比如'NSNumber'为0值数字对象的所有请求保留一个公共实例)。等等 –