2012-02-01 44 views
3

這是我關於Stack Overflow的第一個問題,我希望它非常簡單。我有以下的代碼,我寫弄清楚到底是什麼,我在這種情況下,增加「outerArray」:使用2D NSMutableArray混淆內存行爲

NSMutableArray *contents = [[NSMutableArray alloc] initWithContentsOfFile:path]; 
outerArray = [[NSMutableArray alloc] initWithCapacity:2]; 
[outerArray addObject:contents]; 

[contents removeObjectAtIndex:0]; 
[contents release]; 
contents = nil; 

NSMutableArray *test = [outerArray objectAtIndex:0]; 

NSLog(@"Test at 0: %@", [test objectAtIndex:0]); 

現在,混淆的部分是這樣的:我看到的是元素原本在索引1的內容被NSLog寫出。這是沒有意義的,我:

  • 如果我加入「內容」副本「outerArray」,然後我希望「測試」包含該副本,它將輸出的原始0個元素'內容'。
  • 如果我將'contents'的指針添加到'outerArray',那麼我期望NSLog行會引發錯誤。

我唯一能想到的就是我將一個指向'contents'的指針添加到'outerArray',但是釋放它並不會覆蓋數據。所以,我基本上很幸運,NSLog並沒有失敗,但可能會在稍後。

這是正確的嗎?

回答

1

你看到的是正確的:NSMutableArray保留添加到它的對象,因此即使您的代碼已經發布對它的引用,contents仍然存在。第二個參考文獻(從outerArray以內)保存了您的內部陣列(以前稱爲contents)的發佈。沒有涉及複製。

+0

當然!謝謝! – 2012-02-01 21:38:04

0

它被添加的 '內容' 爲「outerArray」 你做後[outerArray ADDOBJECT:內容]一個指針;

內容將保留+1,

,這樣你就

[內容物的釋放]; 內容=無;

它只是使內容保留-1 並讓內容(這是一個指針)指向零

(@「Test at 0:%@」,[test objectAtIndex:0]);

NSLog

不會發生任何錯誤