Iphone objective-c:addObjectsFromArray是否复制对象?
很难弄明白这一点 addObjectsFromArray是NSArray内部的一种方便方法,它是复制所有内容,还是将“otherArray”参数保留在内存中,并使用LinkedList样式将尾部指向“otherArray”类型的移动 我这样问是因为我有一些指向现有数组中重要对象的指针,但这些指针可能指向传入数组中的另一个对象 我将重要对象指针重新指向传入数组中的某个对象,然后使用传入数组在现有数组上调用addObjectsFromArrayIphone objective-c:addObjectsFromArray是否复制对象?,iphone,objective-c,xcode,pointers,Iphone,Objective C,Xcode,Pointers,很难弄明白这一点 addObjectsFromArray是NSArray内部的一种方便方法,它是复制所有内容,还是将“otherArray”参数保留在内存中,并使用LinkedList样式将尾部指向“otherArray”类型的移动 我这样问是因为我有一些指向现有数组中重要对象的指针,但这些指针可能指向传入数组中的另一个对象 我将重要对象指针重新指向传入数组中的某个对象,然后使用传入数组在现有数组上调用addObjectsFromArray 我担心的是,如果传入数组被实际复制,当ARC决定将传入
我担心的是,如果传入数组被实际复制,当ARC决定将传入数组置零时,我重新指向的重要对象指针将不会指向任何对象。我认为
addObjectsFromArray
的工作原理与addObject
的工作原理相同:指向该对象的指针被添加到数组中;对象本身没有被修改,除了它的保留计数是递增的。我认为addObjectsFromArray
的工作原理就像addObject
:指向对象的指针被添加到数组中;对象本身没有被修改,只是保留计数增加了。我想你想得太多了。你不会有一个指向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
将保持相同的NSMutableString——“酷豆”——它们中的任何一个的突变都会出现在另一个中c
- 该数组与
和b
-“Cool beans”持有相同的NSMutableString,访问该字符串也会显示该字符串的突变c
将为零。重置字符串时,这不会影响任何其他指向字符串的指针,因为它们指向的是字符串,而不是变量a
当您
添加ObjectsFromArray:
时,就好像您在数组上迭代并分别添加了每个数组一样。另一个数组可能会在该点消失,这无关紧要,因为您的NSArray现在有指向所有对象的指针。我认为您想得太多了。你不会有一个指向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
将保持相同的NSMutableString——“酷豆”——它们中的任何一个的突变都会出现在另一个中c
- 该数组与
和b
-“Cool beans”持有相同的NSMutableString,访问该字符串也会显示该字符串的突变c
将为零。重置字符串时,这不会影响任何其他指向字符串的指针,因为它们指向的是字符串,而不是变量a
当您
添加ObjectsFromArray:
时,就好像您在数组上迭代并分别添加了每个数组一样。另一个数组可能会在该点消失,这无关紧要,因为您的NSArray现在有指向所有对象的指针。测试这一点是否比提问更容易?afaik ARC不会立即取消分配,而且过程有些未知,因此不,我认为我无法轻松测试它。这是深度复制,非浅层复制。指令不复制对象。它只是复制对象指针(并适当增加对象保留计数)。这在ARC下的效果和以前一样好。测试这一点会比问问题更容易吗?afaik ARC不会立即取消分配,而且过程有些未知,因此不,我认为我无法轻松测试它。它是深度复制,而不是浅层复制。指令不会复制对象。它只是复制对象指针(并适当增加对象保留计数)。这在ARC下的效果和以前一样好。我想得太多了。当我意识到Nsarray实际上并没有放置物体(像一个盒子),而是告诉你物体在哪里(像一个方向)时,我顿悟了。我想得太多了。当我意识到Nsarray实际上并没有容纳物体(像一个盒子)而是告诉你物体在哪里(像一个方向)时,我顿悟了