Objective c 苹果是否提供isEqual的默认实现:

Objective c 苹果是否提供isEqual的默认实现:,objective-c,cocoa,nsobject,Objective C,Cocoa,Nsobject,在C语言中,有一个默认的相等运算符实现。检查所有成员并验证它们是否满足相等运算符。默认设置有点愚蠢,因为如果对象包含指针,则会对指针执行成员的相等运算符 不过,这对我来说已经足够好了 它也是吗 或者,每次我们创建一个自定义对象时,我们都希望实现isEqual和相应的哈希,而我们可能希望使用isEqual来实现这个自定义对象 在我看来,“默认”实现只是比较对象的指针,而不是它的成员。我说的对吗?甚至比C++标准更差。这就是我想核实的 在我看来,如果我们的类是NSObject的直接子类,那么isEq

在C语言中,有一个默认的相等运算符实现。检查所有成员并验证它们是否满足相等运算符。默认设置有点愚蠢,因为如果对象包含指针,则会对指针执行成员的相等运算符

不过,这对我来说已经足够好了

它也是吗

或者,每次我们创建一个自定义对象时,我们都希望实现isEqual和相应的哈希,而我们可能希望使用isEqual来实现这个自定义对象

在我看来,“默认”实现只是比较对象的指针,而不是它的成员。我说的对吗?甚至比C++标准更差。这就是我想核实的

在我看来,如果我们的类是NSObject的直接子类,那么isEqual将简单地调用它的父类的isEqual,而这只是比较指针


我说的对吗?我只是想确保这一点。

我认为
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