使用2D NSMutableArray混淆内存行为

时间:2012-02-01 03:41:58

标签: objective-c nsmutablearray

这是我关于Stack Overflow的第一个问题,我希望它非常简单。我编写了以下代码来确定我在这种情况下添加到'outerArray'的确切内容:

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]);

现在,令人困惑的部分是这样的:我看到的是最初由NSLog写出的'contents'索引1处的元素。这对我没有意义:

  • 如果我要将'contents'的副本添加到'outerArray',那么我希望'test'包含该副本,它会输出'contents'的原始第0个元素。
  • 如果我要将'contents'的指针添加到'outerArray',那么我希望NSLog行会抛出错误。

我唯一能想到的是我将'contents'的指针添加到'outerArray',但是释放它不会覆盖数据。所以,我现在基本上很幸运,NSLog没有失败,但它可以,稍后。

这是对的吗?

2 个答案:

答案 0 :(得分:1)

您看到的内容是正确的:NSMutableArray会保留添加到其中的对象,因此即使您的代码已经发布了对它的引用,contents仍然有效。第二个引用(来自outerArray内部)是释放内部数组(以前称为contents)的原因。没有涉及复制。

答案 1 :(得分:0)

它正在向“outerArray”添加一个'contents'指针 在你做[outerArray addObject:contents];

之后

内容保留将+1,

所以你做了

[内容发布];   contents = nil;

它只是使内容保留-1 并让内容(它是一个指针)指向nil

NSLog(@“测试0:%@”,[test objectAtIndex:0]);

不会发生任何错误