只考虑array为NSArray的情况。如题。
---------------------------------------
看了下面的回答,可以确定的是,两个方法创建出来两个的Array肯定是两个不同的NSArray实例。
其实我更想问的是,数组中的元素,两者有没有不同?
只考虑array为NSArray的情况。如题。
---------------------------------------
看了下面的回答,可以确定的是,两个方法创建出来两个的Array肯定是两个不同的NSArray实例。
其实我更想问的是,数组中的元素,两者有没有不同?
我是来打自己脸的,之前的回答中输出的是数组指针的地址,所以三个地址都不一样
之前这位的答案是正确的:
以下是验证结果:
可以看出:
copy方法得出的NSArray对象是引用了原NSArray对象
而arrayWithArray方法得出的NSArray对象则是新的对象
但是无论copy还是arrayWithArray得出的NSArray对象的元素仍旧是引用了原先的元素。
两者都是创建新的NSArray对象:
等效。lldb运行结果如下:
(lldb) po NSArray* $test = [@[@"1",@"2"] copy]
(lldb) po $test
<__NSArrayI 0x126f70430>(
1,
2
)
(lldb) po NSArray* $test2 = [NSArray arrayWithArray:@[@"1",@"2"]]
(lldb) po $test2
<__NSArrayI 0x1270b4460>(
1,
2
)
2 回答1.1k 阅读
1 回答1.2k 阅读✓ 已解决
1 回答2.8k 阅读
1 回答1.4k 阅读
1.7k 阅读
1 回答950 阅读
1 回答792 阅读
并不是等效的
[NSArray arrayWithArray:array]
始终会创建一个新的NSArray
对象,并进行填充,copy
不会,对于immutable
类型的NSArray
,copy
只是执行了retain
操作,两个对象共享内存,并没有创建新对象如果
array
是nil
,copy
的结果也将是nil
,而后者会返回一个空的NSArray
补充回答,
如果
array
是immutable
类型的NSArray
copy
只是retain
,没有创建新对象arrayWithArray
创建了新的NSArray
对象,并将原有数组元素填充进去,数组元素还是原来的对象如果
array
是mutable
类型的NSArray
二者最终结果是等效的,创建了新的
NSArray
对象,但数据元素还是原来的对象如果
array == nil
copy
的结果是nil
arrayWithArray
结果是长度为0的NSArray
对象无论哪种情况,数组元素都是共享的 不会被复制