我想知道isEqualToArray
实际上做了什么......
我有一个大小为160的数组,每个数组包含一个包含11个条目的字典,但我可以简单地根据第一列进行比较(包含更改行的日期)。
现在我可以用一个简单的for-cycle来做到这一点:
BOOL different = FALSE;
for (int index = 0 ; index < [newInfo count] ; ++index)
if (![[[oldInfo objectAtIndex:index] objectForKey:@"Update"] isEqual:[[newInfo objectAtIndex:index] objectForKey:@"Update"]]) {
different = TRUE;
break;
}
if (different) {
}
else
NSLog(@"Contact information hasn't been updated yet");
或者我可以使用内置的isEqualToArray方法:
if ([oldInfo isEqualToArray:newInfo])
NSLog(@"Contact information hasn't been updated yet");
else {
NSLog(@"Contact information has been updated, saving new contact information");
[newInfo writeToFile:path atomically:YES];
}
现在,如果假设isEqualToArray
只为每个单元调用isEqualTo
,那么for循环方法运行的时间是isEqualToArray
的1/11(只需要比较一列而不是11)。
也许我只是在进行优化......(我曾经参加过许多比赛,其中运行时间有限且我感觉有后遗症)。
答案 0 :(得分:4)
如果每个数组拥有相同数量的对象,并且每个数组中给定索引处的对象满足
isEqual:
测试,则两个数组具有相同的内容。
所以基本上你是对的。
从设计的角度来看,我会选择isEqualToArray:
,因为如果您关注性能,它会使代码更容易理解或引入BOOL hasUpdates
,这样您还有额外的优势不必在内存中保留两份副本。
答案 1 :(得分:2)
我怀疑很多人错误地认为性能与执行的源语句的数量成正比,并且与等效的直接编码循环相比,像isEqualToArray这样的函数的速度非常快。
事实上,虽然有时候这些API的编码器确实知道一些“交易技巧”,这些技巧可以加快速度(或者可以访问你不能使用的内部接口),但他们必须经常抛出在另外的逻辑中处理你不关心的“古怪”案例,或者仅仅是为了使API“一般”。
因此,在大多数情况下,选择应基于哪个最合理地适合整个程序并使逻辑清晰。在某些情况下,显式循环更好,特别是如果可以利用某些逻辑(例如,采用稍后需要的数组值的“最大值”)以避免重复工作。
此外,当存在复杂的API函数(比isEqualToArray更复杂)时,您不太清楚自己是否理解,通常以直接的方式编写代码而不是处理复杂的函数会更好。一旦你的代码工作,你可以回来并“优化”使用复杂的API。
答案 2 :(得分:-1)
当你知道两个对象都是数组时,isEqualTo<Class>
方法是检查相等性而不是循环的更快方法。
isEqualTo<Class>
用于为equality.so isEqualToArray:
提供特定的检查,检查数组是否包含相同数量的对象。
据我所知,当你知道两个对象是数组时,我可以说isEqualToArray
是更好的选择。