2009-09-02 101 views
1

有人可以解釋這兩者之間的區別,第一個是允許xcode自動生成聲明,最後一個來自Aaron Hillegass的「Cocoa Programming」中的一個例子。返回對象指針的差異?

- (NSString*)planetName { 
    return [[planetName retain] autorelease]; 
} 

- (NSString*)planetName { 
    return planetName; 
} 

我只是好奇,怎麼回事,我的理解是,該方法返回一個指針nil或者現有的字符串對象。我不明白保留並添加到autorelease池的原因?

回答

4

考慮:

NSString *planetName = [myPlanet planetName]; 
[myPlanet setPlanetName: @"Bob"]; 
[planetName length]; 

沒有[[planetName retain] autorelease],上面很可能會崩潰。

retain/autorelease將該對象放入當前線程的autorelease池。這有效地保證對象將保持有效,直到池被耗盡,這通常在當前事件 - 用戶事件,定時器觸發等之後 - 完成處理。

(1)使用@property和@synthesize。它會爲你生成正確的getter/setter。

(2)閱讀Cocoa Memory Management指南。它很好地回答了所有這些問題。

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

0

在這兩種情況下,它們都返回指向nil或字符串對象的指針。

區別在於第一個代碼塊處理內存管理,第二個代碼塊不處理內存管理。第二個代碼塊假設您在您的類實例的其他地方管理planetName,而在第一個代碼塊中,Apple儘可能保守以避免內存泄漏。通過將內存放入當前的自動釋放池中,它將與池一起銷燬。

我的建議是堅持後一種情況,並且比管理自己的對象實例要聰明一點,而不是XCode爲你自動生成的東西。

+1

繼不理解究竟爲什麼會導致爲這些新的可可神祕墜毀的第二圖案。遵循第一種模式[防禦],之後優化可能會更有成效。 – bbum 2009-09-02 16:24:07

+0

如果我添加了一個dealloc方法來做一個[planetName發佈]的類會構成「更明智的內存管理」,並允許我安全地使用較短的「return planetName;」?我已經擁有了這些,我想我可能會感到困惑和*管理,我知道同樣不好。 – fuzzygoat 2009-09-02 16:30:40

+0

基本理念是「對象所有權」 - 您想要選擇一個擁有「planetName」的對象並追蹤該對象內的保留/釋放調用。我會推薦bbum關於內存管理的鏈接 - 它可能需要一點時間才能完成,但這是一個很好的資源,並且需要很長時間。 – fbrereto 2009-09-02 16:38:39