簡體   English   中英

NSMutableArray arrayWithCapacity與initWithCapacity

[英]NSMutableArray arrayWithCapacity vs initWithCapacity

我是具有廣泛Java背景的iPhone / Objective-C新手。

我正在Objective-C中學習有關內存管理的更多信息,並且正在閱讀有關內存管理的Apple文檔: http : //developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

在“對象所有權策略”部分,它表示您擁有通過以alloc,new或包含副本開頭的方法創建的任何對象。 所有權意味着您需要在完成處理后顯式release該對象。

因此,我正在查看NSMutableArray文檔: http : //developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

幾乎有兩種方法可以完成相同的工作...它們都可以創建具有一定初始容量的數組。 一個是類方法,另一個是實例方法。

+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;

現在我是一名懶惰的Java開發人員,為什么知道在某個時候必須自己清理之后,為什么我還是選擇實例方法而不是類方法呢?

我想我這里可能遺漏了一個基本要點...僅僅是確定對象何時釋放的問題嗎? 類方法中的autorelease release與實例方法中的release 我想在資源非常有限(iPhone)的平台上,我應該避免使用類方法,並在完成處理后立即釋放該對象?

謝謝!

通常,您將根據是否擁有該對象的時間超過當前方法的壽命來進行選擇(例如,將其分配給某個靜態對象或直接分配給ivar)。 在這種情況下,可以使用alloc / init方法,因為您知道自己已經擁有它。 如果計划僅將其用於當前方法的范圍,或者將其分配給像屬性這樣管理的對象,則可能會使用便捷方法。

當您知道要擁有要創建的對象時,alloc / init調用總是比便捷/保留方式更高效,因為便利/保留方式基本上需要對alloc / init / autorelease對象進行分配,然后再保留它當它返回時。

當您在循環中分配並且不需要/不想處理自動釋放池時,也可以使用直接alloc / init方法。

arrayWithCapacity:已經對其應用了自動發布。

initWithCapacity:已明確保留,您需要自己釋放它。 由於您通常將其稱為[[A alloc] init ...],因此將觸發一個燈泡“我需要為此管理內存”,除了“ alloc”是“ new”和“ copy”以外,其他類似的魔術字還包括:您可以在內存管理指南中閱讀。 但是從您的問題來看,您似乎很了解它的原理。

您應該對內存的占用空間進行管理並保持較低狀態是正確的,但這並不意味着您需要始終進行顯式的初始化/釋放。 正如Nick所說,使用自動釋放工廠方法的一個用例是當您將它們作為參數傳遞時。

另一個例子是,當您向NSDictionary或NSArray之類的集合中添加內容時,可以使用autorelease factory方法創建“內容”,因為集合“接管”了它。 (添加到集合中時將保留所有內容,刪除時將其釋放。)

您可能會爭辯

Blah *blah = [Blah blahWithSomething];
[myMutableArray addObject:blah];

打字比

Blah *blah = [[Blah alloc] initWithSomething];
[myMutableArray addObject:blah];
[blah release];

在第一種情況下,您完全不必擔心發布調用。 不利的一面是,當您在同一運行循環中多次執行此操作時,如果第一種情況的內存占用量更大,則它是一個臨時/丟棄的數組對象,在運行循環結束時會消失。 但是,如果這是一個很小的對象,而不是循環執行並且要保留更長的時間(通常情況下),那么它們的占用空間是相同的。

在這種情況下,我嘗試遵循以下規則以避免與內存相關的錯誤(==“非常討厭”):

  • 如果您要將該數組作為參數傳遞,則可以使用工廠方法沒有問題,因為接受函數負責保留/釋放它
  • 如果要繼續使用該對象,請使用初始化方法並在最后釋放該對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM