簡體   English   中英

使用NSMutableArray與NSArray的劣勢?

[英]Disadvantage of using NSMutableArray vs NSArray?

我正在使用數組存儲從iPhone應用程序中的數據庫加載的緩存對象,並且想知道:使用NSMutableArray是否有我應該知道的明顯缺點?

編輯:我知道NSMutableArray可以修改,但我正在尋找特定的原因(性能等。)為什么人們會改用NSArray。 我認為會有性能上的差異,但是我不知道它是否重要。

如果要從數據庫加載對象,並且確切知道多少個對象,則可能會從NSMutableArrayarrayWithCapacity:方法中獲得最佳性能,並向其中添加對象直到滿,因此,如果它可以。

在幕后,他們是偷偷同樣的事情- NSArrayNSMutableArray都與實施CFArray s可通過免費電話進行橋接(一CFMutableArrayRefCFArrayRef是類型定義是一樣的東西, __CFArray * )*

NSArrayNSMutableArray應該具有相同的性能/復雜度(訪問時間最差為O(lg N),最好為O(1)),唯一的區別是兩個對象將使用多少內存NSArray有固定的限制,而NSMutableArray可以用盡所有可用空間。

CFArray.h中的注釋對此有更多詳細信息。

*:正如Catfish_Man在下面指出的那樣,這不再是事實。

使用NSArray與NSMutable數組的性能差異主要是在您使用要復制該數組的API時出現的。 如果將-copy發送到不可變數組,則只會增加保留計數,但是將-copy發送到可變數組將分配堆內存。

另外,NSMutableArray不是線程安全的,而NSArray是(與所有可變對象和“不可變”對象相同)。 如果您是多線程的,這可能是一個巨大的問題。

NSMutableArray的主要缺點是,擁有NSMutableArray的對象可能在另一個對象也擁有的情況下更改了數組。 這可能需要您更防御性地編碼對象,而不太積極地追求性能。

如果NSMutableArray沒有暴露在對象外部,則不必擔心。

正是因為它是不可變的,所以NSArray是更好的共享選擇。 每個使用它的對象都可以假定它不會改變,並且不需要防御性地復制它。

可能NSDictionary復制其密鑰而不是簡單地保留它們的原因相同:它需要確保它們不會突變,並且復制是保證密鑰唯一的方法。

創建NSArray后,您將無法對其進行修改。 如果您需要從數組中添加/刪除對象,則可以使用NSMutableArray沒有太多選擇。 我假設NSArray針對固定數組操作進行了優化。 可變數組提供了可修改的靈活性。

暫無
暫無

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

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