我似乎從來沒有得到這個權利。我有一個方法返回一個可變數組。返回數組並避免潛在的內存泄漏的正確方法是什麼?正確的方法返回數組
如果我打算將結果本地存儲在另一個視圖控制器中,是否影響數組應該返回的方式?
最後,如果它只是一個非可變數組呢?這需要不同的技術嗎?
感謝, 豪伊
我似乎從來沒有得到這個權利。我有一個方法返回一個可變數組。返回數組並避免潛在的內存泄漏的正確方法是什麼?正確的方法返回數組
如果我打算將結果本地存儲在另一個視圖控制器中,是否影響數組應該返回的方式?
最後,如果它只是一個非可變數組呢?這需要不同的技術嗎?
感謝, 豪伊
如果你的方法沒有名稱中的alloc或copy,那麼正確的做法是返回數組的自動釋放版本。此外,你應該返回數組以防止修改您的本地副本的副本
- (NSMutabalArray*] mutableArray {
return [[myArray mutableCopy] autorelease];
}
- (NSArray*] array {
return [[myArray copy] autorelease];
}
謝謝 - 作爲跟進是否適用於字典? – Ward 2010-03-21 19:00:49
是的。如果您需要防止對返回副本所做的更改影響您班級中的實例,那麼您通常應該返回任何容器類的mutableCopy副本。如果在方法內部創建容器僅用於返回,則不需要複製機制,在這種情況下,您不需要擔心副本。 – 2010-03-21 19:13:36
我會指出其他讀者通常不應該命名方法'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
對於NSMutableArray的,我會用:
-(NSMutableArray*)getMyArray
{
NSMutableArray *retval = [[NSMutableArray alloc] init];
// do your stuff w/ array
return [retval autorelease];
}
這段代碼的調用者可能要retain
返回數組,因爲它會被自動釋放。
返回一個自動釋放的對象。如果你已經用任何alloc/init/copy方法創建了你的數組 - 你應該在發回autorelease消息之前發送autorelease消息(如return [myArray autorelease];
)。否則使用工廠方法創建的陣列(arrayFrom...
arrayWithContentsOf...
)會返回自動釋放對象,因此您不必擔心那裏的內存泄漏。
您應該閱讀有關內存管理並保留在Apple開發站點上的信息。可能有一些其他初始化方法保留返回的對象,這會導致內存泄漏。
所有這些偉大的答案整點是,從調用的方法,如果你不'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
yar:這是一個有點誤導,因爲它意味着你必須「自動釋放」它,但自動釋放實際上與釋放相同(因爲這就是它的作用,而不是立即)。你的意思是,一個在其選擇器中沒有'alloc','new'或'copy'的方法創建的對象已經被自動釋放,所以你可以返回它。 – 2010-03-21 19:41:34
@Peter Hosey,這就是我的意思,並不意味着暗示你將不得不自己釋放它。我的意思是所謂的方法......好吧,你知道我的意思,你的意見更清楚:) – 2010-03-21 22:52:02