扫码关注官方订阅号
欢迎选择我的课程,让我们一起见证您的进步~~
并不是等效的
[NSArray arrayWithArray:array]始终会创建一个新的NSArray对象,并进行填充,copy不会,对于immutable类型的NSArray,copy只是执行了 retain操作,两个对象共享内存,并没有创建新对象
[NSArray arrayWithArray:array]
NSArray
copy
immutable
retain
如果array是 nil,copy的结果也将是nil,而后者会返回一个空的NSArray
array
nil
补充回答,
如果array是immutable类型的NSArray
copy只是retain,没有创建新对象
arrayWithArray 创建了新的NSArray对象,并将原有数组元素填充进去,数组元素还是原来的对象
arrayWithArray
如果array是mutable类型的NSArray
mutable
二者最终结果是等效的,创建了新的NSArray对象,但数据元素还是原来的对象
如果array == nil
array == nil
copy的结果是nil
arrayWithArray 结果是长度为0的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 )
效果一样,copy指示对象的引用计数+1,arrayWithArray:是+方法,也是计数+1
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
并不是等效的
[NSArray arrayWithArray:array]始终会创建一个新的NSArray对象,并进行填充,copy不会,对于immutable类型的NSArray,copy只是执行了retain操作,两个对象共享内存,并没有创建新对象如果
array是nil,copy的结果也将是nil,而后者会返回一个空的NSArray补充回答,
如果
array是immutable类型的NSArraycopy只是retain,没有创建新对象arrayWithArray创建了新的NSArray对象,并将原有数组元素填充进去,数组元素还是原来的对象如果
array是mutable类型的NSArray二者最终结果是等效的,创建了新的
NSArray对象,但数据元素还是原来的对象如果
array == nilcopy的结果是nilarrayWithArray结果是长度为0的NSArray对象无论哪种情况,数组元素都是共享的 不会被复制
我是来打自己脸的,之前的回答中输出的是数组指针的地址,所以三个地址都不一样

之前这位的答案是正确的:
以下是验证结果:
可以看出:
copy方法得出的NSArray对象是引用了原NSArray对象
而arrayWithArray方法得出的NSArray对象则是新的对象
但是无论copy还是arrayWithArray得出的NSArray对象的元素仍旧是引用了原先的元素。
以下是之前的回复:
两者都是创建新的NSArray对象:

等效。lldb运行结果如下:
效果一样,copy指示对象的引用计数+1,
arrayWithArray:是+方法,也是计数+1