7

给定以下代码示例,newMutableArrray变量是否因两个不同的初始化而不同,还是相同?

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

NSMutableArray *newMutableArray = nil;

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

4 回答 4

15

不 !!!这些初始化之间有两个区别:

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

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

于 2013-04-21T10:35:22.260 回答
7

如果一个数组具有相同的对象(以相同的顺序),则它们等于另一个数组(isEqualToArray:选择器)。这是使用 isEqual: 方法验证的(不管数组是否可变)。

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

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

请注意,即使您将其与非可变副本进行比较,该比较也是正确的。

于 2013-01-06T20:38:26.963 回答
1

不,他们的结果是完全一样的。
只有初始化不同

于 2013-01-06T20:36:48.510 回答
1

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

换句话说:

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]);
       }
   }
}
于 2013-01-06T20:42:53.377 回答