[array copy] 和 [NSArray arrayWithArray:array] 是等效的吗?

1.如果array是immutable类型的NSArray

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

上代码验证:

    NSArray *array = @[@"1",@"2"];
    NSArray *copyArray = [array copy];
    NSArray *arrayWithArray = [NSArray arrayWithArray:array];

控制台输出结果:

(lldb) po array
<__NSArrayI 0x1d003e3c0>(
1,
2
)

(lldb) po copyArray
<__NSArrayI 0x1d003e3c0>(
1,
2
)

(lldb) po arrayWithArray
<__NSArrayI 0x1d003e440>(
1,
2
)

如果是array ==nil,控制台输出:

(lldb) po array
 nil
(lldb) po copyArray
 nil
(lldb) po arrayWithArray
<__NSArray0 0x1d4009620>(

)

2.如果array是mutable类型的NSArray

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

  • 如果array == nil,copy的结果是nil
  • arrayWithArray 结果是长度为0的NSArray对象

上代码验证:

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
    NSArray *copyArray = [array copy];
    NSArray *arrayWithArray = [NSArray arrayWithArray:array];

控制台输出:

(lldb) po array
<__NSArrayM 0x1d064c3c0>(
1,
2
)

(lldb) po copyArray
<__NSArrayI 0x1d0225900>(
1,
2
)

(lldb) po arrayWithArray
<__NSArrayI 0x1d022e5a0>(
1,
2
)

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

你可能感兴趣的:([array copy] 和 [NSArray arrayWithArray:array] 是等效的吗?)