NSArray *collection = [[NSArray alloc] initWithObjects:A, B, C, nil]; //A, B, C are custom "Item" objects
Item *tempItem = [[Item alloc] initWithLength:1 width:2 height:3];
//3 instance variables in "Item" objects
if([collection containsObject:tempItem]) {
NSLog(@"collection contains this item");
}
方法一:
you will either need to send [collection containsObject:] an instance of a variable it contains (e.g. A, B, or C) 向[collection containsObject:]传collection中包含的实例变量,比如[collection containObject:A]。
关于那两个问题
问题一
原题主的代码是这样的:
方法一:
感觉这应该是可以的,毕竟如果就是A, B, C本身的话在内存空间的地址应该是一样的。但是这么做的话觉得这代码也没什么意思了,我用A, B, C初始化了一个collection,然后我又来判断A, B, C是不是在这个collection里面==
方法二:
这应该是正解,详见补充3。
问题二
补充3里面NSHipster的文章里面有详细讲到,下面都是节选翻译自动脑补的。
继承自NSObject的子类要Override这个isEqual:方法要做以下几件事:
如果是自己定义的子类:
最后,重载hash的时候还有一个trick,即用到了XOR,大叔是这么说的,
嗯,就是对性能优化什么的有好处啦,关于这个他推荐了这篇文章。
关于po主的真正Bug
使用stringWithUTF8String:造成比较错误,因为它会在str末尾会包含"\n"。
改成stringWithFormat:的方法即可。
详见补充2.
补充
话说真不是故意自问自答的(答题时间可以证明po主的清白!╮(╯▽╰)╭)
你传过去的参数类型对吗?
楼主,判断iseuqal不是判断指针和地址,是看hash值是不是相同

建议楼主去写一篇文章好了。。竟然自问自答 =͟͟͞͞( •̀д•́)
我以为是提问回答环节,没想到题主 自我解决了问题.还非常详细!非常好!赞一下
containObject比较字符串,实际是看字符串的hash,相同的字符串虽然对象存储地址不同,但hash相同,所以可以直接查找