这是我关于堆栈溢出的第一个问题,我希望它非常简单。我编写了以下代码,以确定在本例中到底要向“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]);

现在,令人困惑的部分是:我所看到的元素,最初是在索引1的'内容'是写出来的。这对我来说毫无意义:
如果我把一个“内容”的副本添加到“OutRealSt数组”,那么我希望“test”包含那个副本,它将输出原始的零个元素“内容”。
如果我将指向“contents”的指针添加到“outerarray”,那么我希望nslog行抛出一个错误。
我唯一能想到的是,我正在将指向“contents”的指针添加到“outerarray”,但是释放它不会覆盖数据。所以,我基本上幸运的是,这一点并没有失败,但后来可能会失败。
是这样吗?

最佳答案

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

关于objective-c - 内存行为与2D NSMutableArray混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9090438/

10-09 02:22