我有一个自定义对象(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"
有没有人知道这里发生了什么?如果这还不够,我可以提供更多信息。
答案 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无法以这种方式进行比较,非常有趣。
请阅读:
请阅读: