Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone objective-c:addObjectsFromArray是否复制对象?_Iphone_Objective C_Xcode_Pointers - Fatal编程技术网

Iphone objective-c:addObjectsFromArray是否复制对象?

Iphone objective-c:addObjectsFromArray是否复制对象?,iphone,objective-c,xcode,pointers,Iphone,Objective C,Xcode,Pointers,很难弄明白这一点 addObjectsFromArray是NSArray内部的一种方便方法,它是复制所有内容,还是将“otherArray”参数保留在内存中,并使用LinkedList样式将尾部指向“otherArray”类型的移动 我这样问是因为我有一些指向现有数组中重要对象的指针,但这些指针可能指向传入数组中的另一个对象 我将重要对象指针重新指向传入数组中的某个对象,然后使用传入数组在现有数组上调用addObjectsFromArray 我担心的是,如果传入数组被实际复制,当ARC决定将传入

很难弄明白这一点

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

我这样问是因为我有一些指向现有数组中重要对象的指针,但这些指针可能指向传入数组中的另一个对象

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


我担心的是,如果传入数组被实际复制,当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
    c
    将保持相同的NSMutableString——“酷豆”——它们中的任何一个的突变都会出现在另一个中

  • 该数组与
    b
    c
    -“Cool beans”持有相同的NSMutableString,访问该字符串也会显示该字符串的突变

  • 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
    c
    将保持相同的NSMutableString——“酷豆”——它们中的任何一个的突变都会出现在另一个中

  • 该数组与
    b
    c
    -“Cool beans”持有相同的NSMutableString,访问该字符串也会显示该字符串的突变

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


当您
添加ObjectsFromArray:
时,就好像您在数组上迭代并分别添加了每个数组一样。另一个数组可能会在该点消失,这无关紧要,因为您的NSArray现在有指向所有对象的指针。

测试这一点是否比提问更容易?afaik ARC不会立即取消分配,而且过程有些未知,因此不,我认为我无法轻松测试它。这是深度复制,非浅层复制。指令不复制对象。它只是复制对象指针(并适当增加对象保留计数)。这在ARC下的效果和以前一样好。测试这一点会比问问题更容易吗?afaik ARC不会立即取消分配,而且过程有些未知,因此不,我认为我无法轻松测试它。它是深度复制,而不是浅层复制。指令不会复制对象。它只是复制对象指针(并适当增加对象保留计数)。这在ARC下的效果和以前一样好。我想得太多了。当我意识到Nsarray实际上并没有放置物体(像一个盒子),而是告诉你物体在哪里(像一个方向)时,我顿悟了。我想得太多了。当我意识到Nsarray实际上并没有容纳物体(像一个盒子)而是告诉你物体在哪里(像一个方向)时,我顿悟了