0

很难弄清楚这个...

addObjectsFromArray 是 NSArray 内部的一种便捷方法,它会复制所有内容,还是将“otherArray”参数保留在内存中的位置,并使用 LinkedList 样式将尾部指向“otherArray”类型的移动?

我问是因为我有指向某些现有数组中的重要对象的指针,但这些指针可能指向传入数组上的不同对象。

我将重要对象指针重新指向传入数组中的某个对象,然后使用传入数组在现有数组上调用 addObjectsFromArray。

我担心的是,如果传入数组实际被复制,当 ARC 决定取消传入数组时,我重新指向的重要对象指针将指向任何内容。

4

2 回答 2

3

我觉得你想多了。你不会有一个“指向” NSArray 的指针。您将有一个指向对象的指针,并且 NSArray 也将有一个指向该对象的指针。重新分配指针不会改变 NSArray 中的指针。

至于复制,NSArray 不复制对象。但如上所述,它确实将指针复制到对象,而不是持有指向指针的指针或类似的奇怪东西。所以在这段代码中:

NSMutableString *a = [NSMutableString stringWithString:@"Cool"];
NSMutableString *b = a;
NSMutableArray *array = [NSMutableArray array];
[array addObject:a];
NSMutableString *c = [array objectAtIndex:0];
[b appendString:@" beans"];
a = nil;

在运行结束时:

  • b并且c将持有相同的 NSMutableString - “Cool beans” - 并且变异其中一个会出现在另一个中

  • b该数组包含与“Cool beans”相同的 NSMutableString,c并且访问那里的字符串也会显示字符串的突变

  • a将为零。当我们重置它时,这不会影响指向字符串的任何其他指针,因为它们指向的是字符串,而不是变量。

当 you 时addObjectsFromArray:,就好像您遍历数组并单独添加每个数组一样。那个时候另一个数组可能会消失,这并不重要,因为你的 NSArray 现在有指向所有对象的指针。

于 2013-01-11T22:18:25.510 回答
1

我认为这addObjectsFromArray就像addObject:将指向对象的指针添加到数组中;对象本身没有被修改,除了它的保留计数会增加。

于 2013-01-11T22:17:02.617 回答