ios - [array copy] 和 [NSArray arrayWithArray:array] 是等效的吗?
天蓬老师
天蓬老师 2017-04-17 16:41:39
[iOS讨论组]
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
PHP中文网

并不是等效的

  1. [NSArray arrayWithArray:array]始终会创建一个新的NSArray对象,并进行填充,copy不会,对于immutable类型的NSArraycopy只是执行了 retain操作,两个对象共享内存,并没有创建新对象

  2. 如果arraynilcopy的结果也将是nil,而后者会返回一个空的NSArray


补充回答,

如果arrayimmutable类型的NSArray

  • copy只是retain,没有创建新对象

  • arrayWithArray 创建了新的NSArray对象,并将原有数组元素填充进去,数组元素还是原来的对象

如果arraymutable类型的NSArray

  • 二者最终结果是等效的,创建了新的NSArray对象,但数据元素还是原来的对象

如果array == nil

  • copy的结果是nil

  • arrayWithArray 结果是长度为0的NSArray对象

无论哪种情况,数组元素都是共享的 不会被复制

PHP中文网

我是来打自己脸的,之前的回答中输出的是数组指针的地址,所以三个地址都不一样
之前这位的答案是正确的:

以下是验证结果:

可以看出:
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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号