为了账号安全,请及时绑定邮箱和手机立即绑定

[array copy] 和 [NSArray arrayWithArray:array] ?

[array copy] 和 [NSArray arrayWithArray:array] ?

BIG阳 2019-02-05 15:11:01
只考虑array为NSArray的情况。如题。---------------------------------------看了下面的回答,可以确定的是,两个方法创建出来两个的Array肯定是两个不同的NSArray实例。其实我更想问的是,数组中的元素,两者有没有不同?
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

并不是等效的

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

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


补充回答,

如果arrayimmutable类型的NSArray

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

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

如果arraymutable类型的NSArray

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

如果array == nil

  • copy的结果是nil

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

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


查看完整回答
反对 回复 2019-03-16
?
莫回无

TA贡献1865条经验 获得超7个赞

等效。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

)


查看完整回答
反对 回复 2019-03-16
?
FFIVE

TA贡献1797条经验 获得超6个赞

效果一样,copy指示对象的引用计数+1,
arrayWithArray:是+方法,也是计数+1



查看完整回答
反对 回复 2019-03-16
  • 3 回答
  • 0 关注
  • 649 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信