簡體   English   中英

NSMutableArray -init vs. + arrayWithCapacity:

[英]NSMutableArray -init vs. +arrayWithCapacity:

我有兩個功能,我應該使用哪一個? 請解釋一下差異。

A:

- (NSMutableArray *)FunctionA:(int)count {

    NSMutableArray *a = [[NSMutableArray alloc] init];

 for (int i = 0; i < count; i++) {
  [a addObject:[NSNumber numberWithInt:0] ];
    }

    return [a autorelease];
}

B:

-(NSMutableArray *)FunctionB:(int)count {

 NSMutableArray *b = [NSMutableArray arrayWithCapacity:count];

 for (int i=0;i<count; i++){  
  [b addObject:[NSNumber numberWithInt:0] ];  
 }

 return b;  //  or [b autorelease] ?
}

第一個創建可變數組而不指定容量。 這會導致在添加項目時數組必須增長。 在內部,這可能經過大量優化,一次發生“塊”,但仍需要增加數組並在添加項目時分配更多空間。

第二個給數組一個提示(你可能需要“這么多”的空間),以避免在添加已知數量的對象時增加數組的開銷。 當然,如果需要,它仍然會變大(就像你沒有指定容量一樣)。 如果您已經提前了解計數,則應使用此方法。 計數很大,速度更快。

如果您在優化之前沒有測量過,那么這有一個缺點:如果您正在創建一個具有非常高容量但不總是使用該容量的可變陣列,則會產生分配所有空間的代價。

此外,你沒有自動釋放B(你注釋掉了),因為你沒有用init創建可變數組 - 你使用了一個方便的方法,它自己做了,這意味着你不負責釋放它。 正如我在對您的問題的另一個答案的評論中提到的,您還可以使用以下命令創建數組:

[[NSMutableArray alloc] initWithCapacity:capacity];

...然后在准備好后釋放它。 與使用自動釋放池相比,這使您可以更好地控制內存使用,這是iPhone平台上的一個重要考慮因素。

但請記住:先測量,然后根據需要進行優化。

可變對象仍然需要分配空間,以便為10個對象分配默認值。 如果添加第11個,則可變數組將必須分配新內存,將項目復制到新內存,並釋放舊內存。

這通常是如此之快,你甚至不會注意到,但它可以減慢它。 創建具有大小的可變數組最初會創建指定大小的數組,因此希望減少調整大小。

在第一個示例中,您必須管理數組的內存,因為您使用+alloc-init創建它(這就是您需要向其發送-autorelease的原因)。

在第二個示例中,您不必管理數組的內存,因為它會自動釋放返回給您(因為您使用便捷方法創建它)。 此外,由於您預先指定了所需的陣列大小,因此可能更高效。

如果你想返回一個自動釋放的數組,那么第二個選項可能更可取,因為+arrayWithCapacity:將返回一個已經自動釋放的數組。 此外,由於返回給你的數組已經自動釋放,你不必自己發送-autorelease

如果您對內存管理有任何疑慮,那么必須閱讀Apple 內存管理指南

我用B:

我看到它的優點是

  • 隨着數組變大,數組不需要調整大小
  • arrayWithCapacity:為您自動釋放所以您不必,這提高了代碼可讀性imho

我希望有所幫助。

暫無
暫無

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

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