将2个对象与' =='进行比较当对象处于不同的内存addesses时返回True(objective-C)

时间:2015-08-09 05:40:51

标签: objective-c pointers equality

我有一个自定义对象(Artist),它是一个NSManagedObject子类(它是我的Core Data数据库中的一个实体)。

在Artist对象上声明了以下2个属性:

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSSet *artworks;

当比较两个艺术家对象('选择艺术家'和#39;艺术家')时,即使它只比较指针,以下似乎也会执行深度相等比较。当两个Artist对象具有相同的名称'时,它返回true。和'艺术品'即使它们位于不同的内存地址:

if (selectedArtist == artist) {
    NSLog(@"found equal artists");
    NSLog(@"Selected artist named: %@ located at: %p", selectedArtist.name, &selectedArtist);
    NSLog(@"Other artist named: %@ located at: %p", artist.name, &artist);
}

具有相同'名称'的2个艺术家对象的输出和'艺术品':

"找到了平等的艺术家

选定的艺术家名为:artist1,位于:0x175a80e8

其他艺术家:artist1位于:0x1716bc"

有没有人知道这里发生了什么?如果这还不够,我可以提供更多信息。

2 个答案:

答案 0 :(得分:1)

你正在记录一些完全没有意义的东西并且被它弄糊涂了。

你有两个变量,selectedArtist和artist,都指向同一个对象。这就是“==”的比较。但是您正在记录变量的地址。当然,您会得到不同的结果,因为有两个不同的变量。

int x = 5;
int y = 5;

if (x == y) {
    NSLog (@"%p %p", &x, &y); // Not tested
}

你期望& x和& y是一样的吗?当然不是。你让自己完全糊涂了,并且得出了错误的结论。你有两个指向同一个对象的变量,所以变量比较相等,当然名称和艺术品将相等,因为它们是名称和艺术品是相同的。

答案 1 :(得分:0)

我甚至不知道你在问什么。问题是你不能只使用“==”来比较对象,它不会那样工作。 Apple为这些东西指定了比较器。你真的应该发布你的自定义NSManagedObject看起来像什么,但即使没有它,因为这些是NSSets,以下应该工作:

if ([[selectedArtist artworks] isEqualToSet:[artist artworks]]) {
    //do work
}

你也可以将NSSet转换为数组并比较数组,你也可以比较NSString“name”,假设这个代码对应你的托管对象。

if ([[selectedArtist name] isEqualToString:[artist name]]) {
  //do work
}

根据以下评论,这是您想要的信息。首先,“==”比较指针,我猜这很奇怪,因为你显示指针是相同的。看起来NSManagedObjects可以与“==”进行比较就好了,只有某些NSObjects无法以这种方式进行比较,非常有趣。

请阅读:

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/index.html#//apple_ref/doc/uid/TP30001171-223939

请阅读:

http://nshipster.com/equality/