這是一個與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值數字對象的所有請求保留一個公共實例)。等等 –