這個問題隨之而來的是上一個問題,這引發了進一步的問題。我試圖理解的是,當這個例子中的指針和對象正在被創建並且最終發生在他們身上時。我仍然試圖讓這個問題得到解決,所以請原諒我可能提出的任何錯誤假設。NSString的setter,它是如何工作的?
// MAIN
int main (int argc, const char * argv[]) {
PlanetClass *newPlanet_01 = [[PlanetClass alloc] init];
[newPlanet_01 setGeekName:@"StarWars"];
}
。
// CLASS
@interface PlanetClass : NSObject {
NSString *geekName;
}
- (NSString*) geekName;
- (void) setGeekName:(NSString*)gName;
@end
。
// SETTER
- (void)setGeekName:(NSString *)gName {
if (geekName != gName) {
[geekName release];
geekName = [gName copy];
}
}
(A)......當PlanetClass「newPlanet_01」的一個實例,首先創建僅僅是一個指針創建的NSString實例變量對象,或一個可能的未來對象?如果它只是一個指針,那麼在setter中稍後將它釋放爲只是一個指針,而不是指向一個對象的指針?
(B)...在上面的例子中,「gName」是一個指向NSString對象@「StarWars」的指針?
(C)......接下來是指針geekName從不同的gname(即如果geekName確實在@ 「星球大戰」 沒有點)
(d)... geekName發佈,什麼被釋放第一次運行代碼時,我的理解是geekName只是一個指向任何東西的指針。或者釋放只是第一次發佈什麼? (E)...最後geekName = [gName copy];新發布的geekName現在被分配指向gName的副本,原始gName會發生什麼變化?
我有一個關於5/E的問題。在這種情況下,是內存泄漏嗎?常量字符串會發生什麼?他們的記憶是如何回收的? – jergason 2009-08-28 15:27:55
非常感謝,完美。關於(5/E),我猜想當它超出範圍時它會自動銷燬(自動),但這只是猜測,因爲我已經這樣做了8天:) – fuzzygoat 2009-08-28 15:33:20
這不是內存泄漏。您不會從字符串常量中回收內存 - 它們會在程序期間停留。對於字符串常量,創建它們的代碼由編譯器發出(因此是可執行二進制文件的一部分) - 具體地說,它們存儲在一個稱爲二進制文件的「數據段」的區域中(程序指令被存儲在「文本段」中)。所以你不必擔心「釋放」或「泄漏」字符串常量的內存。 (這至少適用於C和C派生語言,如ObjC。) – mipadi 2009-08-28 15:33:50