Objective c 苹果是否提供isEqual的默认实现:
在C语言中,有一个默认的相等运算符实现。检查所有成员并验证它们是否满足相等运算符。默认设置有点愚蠢,因为如果对象包含指针,则会对指针执行成员的相等运算符 不过,这对我来说已经足够好了 它也是吗 或者,每次我们创建一个自定义对象时,我们都希望实现isEqual和相应的哈希,而我们可能希望使用isEqual来实现这个自定义对象 在我看来,“默认”实现只是比较对象的指针,而不是它的成员。我说的对吗?甚至比C++标准更差。这就是我想核实的 在我看来,如果我们的类是NSObject的直接子类,那么isEqual将简单地调用它的父类的isEqual,而这只是比较指针Objective c 苹果是否提供isEqual的默认实现:,objective-c,cocoa,nsobject,Objective C,Cocoa,Nsobject,在C语言中,有一个默认的相等运算符实现。检查所有成员并验证它们是否满足相等运算符。默认设置有点愚蠢,因为如果对象包含指针,则会对指针执行成员的相等运算符 不过,这对我来说已经足够好了 它也是吗 或者,每次我们创建一个自定义对象时,我们都希望实现isEqual和相应的哈希,而我们可能希望使用isEqual来实现这个自定义对象 在我看来,“默认”实现只是比较对象的指针,而不是它的成员。我说的对吗?甚至比C++标准更差。这就是我想核实的 在我看来,如果我们的类是NSObject的直接子类,那么isEq
我说的对吗?我只是想确保这一点。我认为
NSObject
的实现执行指针比较,SDK中的各种其他类执行最合适的操作,即NSString
对字符串内容进行比较,NSArray
比较内容相等性,等等。如果您想为自定义对象定义“更好”的等式,您必须决定语义并自己实现它。我认为NSObject
的实现进行指针比较,SDK中的各种其他类做最合适的事情,例如,NSString
对字符串内容进行比较,NSArray
比较内容相等性,等等。如果你想为你的自定义对象定义“更好”的相等性,你必须决定语义并自己实现它。这有点令人困惑,因为苹果公司在协议和接口之间分离文档的方式
@protocol NSObject
- (BOOL)isEqual:(id)object;
这是一个必须实现的方法,所以NSObject(类)肯定实现了这一点,尽管您从Apple开发站点上的类定义中不知道这一点。这直接来自xcode中的头文件
一般来说,如果不实现自定义的isEqual,您将期望只获得指针标识,这在许多情况下是可以的。系统需要按照您识别唯一实例的方式进行设计,而不考虑特定功能(如哈希和isEqual)的特殊性。如果你需要测试指针之外的对象是否相等,那么你只需要这样做。这有点令人困惑,因为苹果公司在协议和接口之间分离文档的方式
@protocol NSObject
- (BOOL)isEqual:(id)object;
这是一个必须实现的方法,所以NSObject(类)肯定实现了这一点,尽管您从Apple开发站点上的类定义中不知道这一点。这直接来自xcode中的头文件
一般来说,如果不实现自定义的isEqual,您将期望只获得指针标识,这在许多情况下是可以的。系统需要按照您识别唯一实例的方式进行设计,而不考虑特定功能(如哈希和isEqual)的特殊性。如果您需要测试指针之外的对象是否相等,那么您只需这样做。因为
NSObject
提供了isEqual:
,并且您的所有对象都是NSObject
的后代,那么简单的答案是提供了默认实现
现在,您关心这个默认使用的算法,并在一条评论中写道“我不能简单地通过测试来确定”。让我们看看测试,只是为了好玩;-)
现在,isEqual:
是一个相当基本的方法,如果苹果决定改变其语义,后果可能是重大的,而且不是好的。因此,尽管苹果可以自由地改变它的实现方式,但前提是语义保持不变,这意味着相同的对象在更改后与之前相同。现在您已经提到了三种可能的算法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");
有一点。由于
NSObject
提供了isEqual:
,并且您的所有对象都是NSObject
的后代,那么简单的答案是提供了默认实现
现在,您关心这个默认使用的算法,并在一条评论中写道“我不能简单地通过测试来确定”。让我们看看测试,只是为了好玩;-)
现在,isEqual:
是一个相当基本的方法,如果苹果决定改变其语义,后果可能是重大的,而且不是好的。因此,尽管苹果可以自由地改变它的实现方式,但前提是语义保持不变,这意味着相同的对象在更改后与之前相同。现在您已经提到了三种可能的算法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");
有一点。我只想要t