2011-03-07 41 views
1

當在Objective-C中使用alloc init創建數組時,如何在將對象添加到數組中時管理內存?C數組vs Obj-C數組

我想知道這是如何創建一個數組和malloc時,分配的大小需要是預期數組的大小或數組內存需要重新分配。

這些如何相關,或者什麼是理解C代碼工作方式的好方法。

在添加對象時是否在內部處理objective-c數組內存?或者它如何工作?

+0

NSArray內部處理的內存究竟是一個實現細節 - 也就是說,沒有單一的正確答案。它可以在編譯器,版本,運行時庫,操作系統等之間有所不同。這就是說,很可能通過malloc()。 – 2011-03-07 23:32:29

+0

關於唯一可以肯定地說的是,NSArray將使用比C數組更多的內存(您爲特性付費),但添加一個項目的delta成本可能會更便宜,因爲整個數組將會不會被重新分配,這對於C數組很有可能(但不是確定的)。 – CRD 2011-03-08 00:03:37

+0

@CRD:NSArray是不可變的。您無法在原地添加項目。 – 2011-03-08 00:11:30

回答

2

Objective-C數組遵循與其他Objective-C對象相同的內存管理規則。如果你分配它,你需要釋放它。

C數組和Objective-C數組在概念上是相似的,但實現方式有很大不同。一個C數組是一個連續的內存塊,除了一個控制你如何使用它的語言結構之外,它幾乎沒有什麼特殊之處。 Objective-C數組是具有重要內置功能的對象。他們動態地調整自己的大小(如果它們是可變的)以適應添加的元素。他們妥善保留和釋放他們存儲的對象。他們可以對自己進行排序,過濾自己,插入對象,刪除對象等等。你不應該假設它們是如何實現的。

Apple的文檔應該能夠讓你更好地理解Objective-C數組的可能性(當然你也可以看看其他集合類)。從這裏開始閱讀: Collections Programming Topics

1

NSArrays(並通過擴展NSMutableArrays)保留添加到它們的對象,並在釋放數組本身時向它們發送所有釋放消息。

這樣做的結果是一個常見的模式是分配一個對象,初始化它,將它交給數組,然後釋放它。由於數組自身保留了它,它會持續到數組本身爲止,或者直到您指示數組擺脫它。你永遠不需要發送另一個釋放消息,陣列機器負責這一點。

我猜,可變數組實現爲類似鏈接列表的東西,所以他們可以在以後輕鬆擴展和收縮。這只是一個指針列表,可能還有一點元數據。由於它不是創建交給它的任何對象,只是把它自己的皮帶放在它們上面,所有它需要做的事情都有一個指向對象的指針。