NSMutableArray arrayWithArray与NSArray mutableCopy的比较相同?

时间:2013-01-06 20:27:05

标签: objective-c ios6 nsmutablearray

鉴于以下代码示例,newMutableArrray变量是否根据两个不同的初始化而不同,或者相同?

NSArray *originalArray = @[obj1, obj2, oj3];

NSMutableArray *newMutableArray = nil;

if (thereIsSomeDifference) {  
    newMutableArray = [NSMutableArray arrayWithArray:originalArray];  
}  
else {  
    newMutableArray = [originalArray mutableCopy];  
} 

4 个答案:

答案 0 :(得分:15)

不!这些初始化之间存在两个差异:

  1. 保留计数:在第一种情况下,你得到一个自动释放的对象,在第二种情况下,你得到一个保留对象,你需要在之后释放它(这不适用于ARC)

  2. 如果originalArray是nil,在第一种情况下,你将获得一个带有0项的可变数组,在第二种情况下,你将获得nil(因为向nil发送消息返回nil)。在你的例子中,很明显originalArray不是零,但在现实生活中你可以达到这种情况(我只是遇到了这种情况)

答案 1 :(得分:7)

如果数组具有相同的对象(以相同的顺序),则该数组等于另一个数组(isEqualToArray:selector)。这是使用isEqual:方法验证的(忽略数组是否可变)。

它们是相同的,一个或另一个初始化没有任何区别。验证此日志记录isEqualToArray的结果:。

NSArray *originalArray = @[obj1, obj2, oj3];
NSMutableArray *newMutableArray = nil;
newMutableArray = [NSMutableArray arrayWithArray:originalArray];  
thereIsSomeDifference= ![newMutableArray isEqualToArray: [originArray mutableCopy] ];

请注意,即使您将其与不可变副本进行比较,该比较也会成立。

答案 2 :(得分:1)

不,它们的结果完全相同。
只有初始化是不同的

答案 3 :(得分:1)

为了回答,我们必须定义“相同”。这两个并排将导致不同的集合,但只要它们指向相同的元素,它们将是相同的。

换句话说:

initA = [NSMutableArray arrayWithArray:originalArray];  
initB = [originalArray mutableCopy];

if (initA == initB) {
   // unreachable, because the pointers differ
}

// however
if ([initA isEqualToArray:initB]) {
   // will be true
   // because
   for (int i=0; i<initA.count; i++) {
       if ([initA objectAtIndex:i] == [initB objectAtIndex:i]) {
           NSLog(@"this will log every element %@ in the arrays", [initA objectAtIndex:i]);
       }
   }
}