[英]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.