2010-03-21 103 views
3

我似乎從來沒有得到這個權利。我有一個方法返回一個可變數組。返回數組並避免潛在的內存泄漏的正確方法是什麼?正確的方法返回數組

如果我打算將結果本地存儲在另一個視圖控制器中,是否影響數組應該返回的方式?

最後,如果它只是一個非可變數組呢?這需要不同的技術嗎?

感謝, 豪伊

+0

所有這些偉大的答案整點是,從調用的方法,如果你不'alloc'你不」不得不「釋放」,這意味着它必須是自動釋放的。想要離開這個鏈接http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH – 2010-03-21 19:21:08

+0

yar:這是一個有點誤導,因爲它意味着你必須「自動釋放」它,但自動釋放實際上與釋放相同(因爲這就是它的作用,而不是立即)。你的意思是,一個在其選擇器中沒有'alloc','new'或'copy'的方法創建的對象已經被自動釋放,所以你可以返回它。 – 2010-03-21 19:41:34

+0

@Peter Hosey,這就是我的意思,並不意味着暗示你將不得不自己釋放它。我的意思是所謂的方法......好吧,你知道我的意思,你的意見更清楚:) – 2010-03-21 22:52:02

回答

4

如果你的方法沒有名稱中的alloc或copy,那麼正確的做法是返回數組的自動釋放版本。此外,你應該返回數組以防止修改您的本地副本的副本

- (NSMutabalArray*] mutableArray { 
    return [[myArray mutableCopy] autorelease]; 
} 

- (NSArray*] array { 
    return [[myArray copy] autorelease]; 
} 
+0

謝謝 - 作爲跟進是否適用於字典? – Ward 2010-03-21 19:00:49

+0

是的。如果您需要防止對返回副本所做的更改影響您班級中的實例,那麼您通常應該返回任何容器類的mutableCopy副本。如果在方法內部創建容器僅用於返回,則不需要複製機制,在這種情況下,您不需要擔心副本。 – 2010-03-21 19:13:36

+2

我會指出其他讀者通常不應該命名方法'getFoo',因爲Cocoa樣式中的「get」前綴表示一個通過引用返回值的方法(如NSColor的'getRed:green:blue:alpha :',它需要四個指向CGColor變量的指針,你希望它們放置組件值)。請參閱http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html和http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueCoding /Concepts/AccessorConventions.html。 – 2010-03-21 19:46:32

1

對於NSMutableArray的,我會用:

-(NSMutableArray*)getMyArray 
{ 
    NSMutableArray *retval = [[NSMutableArray alloc] init]; 
    // do your stuff w/ array 
    return [retval autorelease]; 
} 

這段代碼的調用者可能要retain返回數組,因爲它會被自動釋放。

+0

作爲一個NSMutableArray *被返回,我建議在返回的對象上調用'copy',除非你想要數組能夠在你下面改變。 – Abizern 2010-03-21 18:57:00

+0

謝謝 - 如果我保留返回的數組或不保留它,有什麼區別?這只是我打算如何處理它的問題,所以如果我以後可能需要它,我應該保留它嗎? – Ward 2010-03-21 18:58:25

+0

如果您希望在調用方法結束時保留它,則只需「保留」它。否則,你有'autoreleased'對象,直到你的方法退出。 – 2010-03-21 19:22:27

2

返回一個自動釋放的對象。如果你已經用任何alloc/init/copy方法創建了你的數組 - 你應該在發回autorelease消息之前發送autorelease消息(如return [myArray autorelease];)。否則使用工廠方法創建的陣列(arrayFrom...arrayWithContentsOf...)會返回自動釋放對象,因此您不必擔心那裏的內存泄漏。

您應該閱讀有關內存管理並保留在Apple開發站點上的信息。可能有一些其他初始化方法保留返回的對象,這會導致內存泄漏。