我只是想知道对象是否在数组中。
所以我可以使用:
- (BOOL)containsObject:(id)anObj
但它会将-isEqual发送给数组中的每个对象。当有成千上万的时候很糟糕。
然后有:
- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject
似乎只比较内存地址。我认为这更快。但是当然有点讨厌使用。人们必须检查NSNotFound。
-indexOfObjectIdenticalTo真的是最好的选择吗?
答案 0 :(得分:2)
但使用
有点讨厌
为什么呢?在我看来
if ([array indexOfObjectIdenticalTo: foo] != NSNotFound)
{
// do what you need
}
并不比
更讨厌if ([array containsObject: foo])
{
// do what you need
}
您选择哪一个取决于您使用的等同语义。您几乎肯定希望对包含-containsObject:
或NSString
的数组使用NSNumber
,因为-isEqual:
给出了正确的相等语义。
顺便提一下,这两种方法都是 O(n),这是真正的性能问题所在。如果线性搜索的想法是一个问题,请考虑不同的数据结构,例如基于NSDictionary。
答案 1 :(得分:2)
如果您经常需要这个,可以按类别创建实例方法:
@interface NSArray (MONStuff)
- (BOOL)mon_containsObject:(id)object;
@end
@implementation NSArray (MONStuff)
- (BOOL)mon_containsObject:(id)object {
return NSNotFound != [self indexOfObjectIdenticalTo:arg];
}
@end
或者这些也是CFArrayContainsValue
。
一个简单的功能也足够了。
答案 2 :(得分:1)
答案 3 :(得分:1)
如果可能(例如,如果排序顺序无关紧要),您可以改为使用NSDictionary,将对象作为键{和值[NSNull null]
。请注意,用作键时会复制对象!您的对象需要实现- (NSUInteger)hash
方法。
另见Matt Gallagher的优秀NSArray or NSSet, NSDictionary or NSMapTable分析。