Objective c NSArray等质量方法的清晰描述?
我不清楚NSArray的isEqual方法如何比较两个阵列的元素。它是否检查两个数组是否包含相同的对象(例如==)?还是在对象上使用isEqual比较两个数组的内容Objective c NSArray等质量方法的清晰描述?,objective-c,cocoa,Objective C,Cocoa,我不清楚NSArray的isEqual方法如何比较两个阵列的元素。它是否检查两个数组是否包含相同的对象(例如==)?还是在对象上使用isEqual比较两个数组的内容 我发现苹果公司关于这种方法的文档简洁而不清楚。我也找不到NSArray.m的源。默认情况下,Cocoa中的所有对象都与-isEqual:进行比较。但是,NSObject上的-isEqual:的默认版本执行指针比较。因此,如果对象没有正确实现它的-isEqual:和-hash方法,它只会比较指针 问题很清楚: 如果两个数组都包含相同数
我发现苹果公司关于这种方法的文档简洁而不清楚。我也找不到NSArray.m的源。默认情况下,Cocoa中的所有对象都与
-isEqual:
进行比较。但是,NSObject
上的-isEqual:
的默认版本执行指针比较。因此,如果对象没有正确实现它的-isEqual:
和-hash
方法,它只会比较指针 问题很清楚:
如果两个数组都包含相同数量的对象,并且每个数组中给定索引处的对象满足isEqual:test,则两个数组的内容相等
这意味着,
isEqual
(而不是=
)将用于测试对象的相等性。现代Cocoa文档中没有答案,但如果你去,你会发现这个宝石:
-(BOOL)isEqual:
(id)一个对象
如果接收器和对象相等,则返回YES;否则返回NO。YES返回值表示receiver和anObject都是从NSArray继承的类的实例,并且它们都包含相同的对象(由isEqualToArray:
方法确定)
除了遗留文档之外,最接近答案的是Cocoa的编码指南,这似乎意味着isEqual:
和IseQualTowhere:
应该做同样的事情,唯一的区别是类型安全级别
尽管如此,我还是建议要求澄清这些文件。也许是这样的!?(在此处键入,因此可能会出现打字错误)
if(![array1 isKindOfClass:[NSArray class]]| |![array2 isKindOfClass:[NSArray class]]))
返回否;
if(array1==array2)
返回YES;
if(array1.count!=array2.count)
返回否;
对于(int i=0;iYou是对的,NSObject isEqual的文档充其量是不清楚的,isEqualToArray的文档没有说明它是否等同于isEqual。(然而,从字里行间看,我大约有95%的信心NSArray isEqual只是调用ISEQUALTOARY,后者适当地级联比较。)如果您确实需要源代码,这可能很有用……Cocoa的源代码尚未打开。但是,您可以将特定类的某些对象放入数组中,并在该类的isEqual:
上设置断点,以查看在将isEqual:
发送到数组时它是否被命中。文档非常不清楚。我花了几分钟时间查找g,找不到有关NSArray isEqual的任何文档,而NSObject isEqual的文档没有说明如何处理NSArray(除了告诉您查看NSArray文档)。您引用的是isEqualToArray:
,而不是isEqual:
@HotLicks的文档。我不同意。Cocoa中的对象与-isEqual:
方法进行比较,句号,而不仅仅是==
。我认为文档很清楚,因为容器对象具有指定精确的-isEqualTo.
类型方法如果你简单地在这些容器上调用-isEqual:
,它们只会检查对象是否是同一个类,然后调用适当的比较方法。规范没有(我能找到的任何地方)详细说明isEqual
是如何应用于NSArrays的。这是OP的抱怨。这是我所期望的。我希望有人能肯定地证实。
if(![array1 isKindOfClass:[NSArray class]] || ![array2 isKindOfClass:[NSArray class]])
return NO;
if(array1 == array2)
return YES;
if(array1.count != array2.count)
return NO;
for(int i =0; i<array1.count;i++)
if(![array1[i] isEqual:array[i]])
return NO;
return YES;