鉴于以下代码示例,newMutableArrray
变量是否根据两个不同的初始化而不同,或者相同?
NSArray *originalArray = @[obj1, obj2, oj3];
NSMutableArray *newMutableArray = nil;
if (thereIsSomeDifference) {
newMutableArray = [NSMutableArray arrayWithArray:originalArray];
}
else {
newMutableArray = [originalArray mutableCopy];
}
答案 0 :(得分:15)
不!这些初始化之间存在两个差异:
保留计数:在第一种情况下,你得到一个自动释放的对象,在第二种情况下,你得到一个保留对象,你需要在之后释放它(这不适用于ARC)
如果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]);
}
}
}