2011-04-16 55 views
0

我是新手到iPhone/Mac空間,這可能是一個非常基本的問題,我已經做了一些搜索,並沒有找到直接的答案。關於iPhone對象C數組和深度指針複製的基本問題

我想知道在添加時,Arrays/Mutable Arrays的addObject方法是淺層(僅指針)還是深層(複製對象)。

  1. 一個可變數組已經頁頭
  2. 一個的NSString已經頁頭帶有某種初始化的
  3. 我們ADDOBJECT字符串的可變數組
  4. 我們再鬆開的NSString

如果這是做事的正確方法,那假設addObject將會執行NSString的深層副本。只是確認這是用可變陣列進行內存管理的正確方法...

+0

複製引用不淺拷貝。 「copy」和「mutableCopy」是淺拷貝。參考僅僅是一個參考。可以有一百萬個對象或一個對象的引用,在任何情況下它*都不會影響對象的狀態*。 – bbum 2011-04-16 22:14:04

回答

2

addObject:做了一個淺拷貝。你缺少的是NSMutableArray保留該對象,所以它不會消​​失,但不需要深度複製。這是Objective-C內存管理的一個關鍵點。您應該閱讀Memory Management Programming Guide。可可記憶管理並不複雜,並且非常一致。我在Three Magic Words有一個簡短的摘要。

+0

NSArray的'addObject:'不會複製任何東西。指針副本不是一個ashallow副本。 – bbum 2011-04-16 22:13:23

+0

像往常一樣,@ bbum是正確的。 S /淺/指針/。 – 2011-04-17 01:01:50

+0

是的,雖然我瀏覽過,但像上面的例子不清楚添加和從集合中刪除等,所以我還可以假設,如果一個remoteObjectAt被調用,同樣的事情發生,它的保留計數也減去一。 .....從我在文檔中讀到的這是發生了什麼,只是想確定。與其他3gls相比,這是一種獨特的做事方式。但我很有意思。 Apple只需要在IOS平臺上實現託管內存控制...... – ort11 2011-04-18 12:47:17

2

將對象添加到數組時,其保留計數將增加。一個對象將在其保留計數爲0時被釋放。因此,向您添加NSString時,它不會是副本(您可以更改foo並且它也會在數組中更改),但會增加foo的保留計數通過1.

NSString *foo = [[NSString alloc] [email protected]"bar"]; // retain count +1 
[anArray addObject:foo]; // NOT COPIED, but retain count of 'foo' increased by 1 
[foo release]; // retain count of foo decreased by 1 

當你在某個時候發佈anArray時,它會調用它的對象釋放。所以foo的保留數將最終變爲0,並且foo將被釋放。

// some time later.. 
[anArray release]; // anArray released, foo retain count = 0.. foo gets released. 

親切的問候, 基督教