作为NSObject
provide isEqual:
,并且您的所有对象都是 的后代NSObject
,那么简单的答案是提供了默认实现。
现在您担心此默认使用的算法,并在评论中写下“我不会仅通过测试来确定”。让我们看看测试,只是为了好玩;-)
NowisEqual:
是一种相当基本的方法,如果 Apple 决定改变其语义,后果可能会很严重而且不好。因此,尽管 Apple 可以自由更改其实现方式,但前提是语义保持不变,这意味着相同的对象在更改后与以前一样比较相等。现在您已经提到了三种可能的算法isEqual:
可以使用:
- 指针比较 - 它是完全相同的对象吗
- 浅比较 - 直接比较对象的字段是否具有相同的值
- 深度比较 - 直接比较的非指针值字段是否具有相同的值,并使用指针值字段比较相等
isEqual:
这些都有不同的语义,无论苹果选择了哪一个,它都无法在不破坏大量代码的情况下进行更改。不同的语义意味着你可以测试......
在我键入时进行编码,预计会出现错误!只有重要的部分包括:
@implementation A
- (BOOL) isEqual:(id)other
{
NSLog(@"A.isEqual called");
return self == other; // true iff same object
}
@end
@interface B
@property (readwrite) int anInteger;
@property (readwrite) A *anA;
@end
@implementation B
@synthesize anInteger, anA;
@end
// Let's test the algorithm
A *myA = [A new];
B *bOne = [B new];
B *bTwo = [B new];
bOne.anInteger = 42;
bOne.anA = myA;
bTwo.anInteger = 42;
bTwo.anA = myA;
// What output is produced (all of it!)
NSLog(@"[bOne isEqual:bTwo] -> %@", [bOne isEqual:bTwo] ? @"Yes" : @"No");
HTH 一点。