如何检查NSMutableArray是否已在数组中具有(__bridge id)对象

时间:2013-01-16 18:33:21

标签: ios objective-c nsmutablearray compare abrecordref

我正在尝试将ABRecordRef项添加到我的NSMutableArray中。刚刚了解到需要使用(_bridge id)将C TypeDef强制转换为Objective-C id类型。因此,在将新项添加到数组之前,我想检查对象是否已经在数组中。因此,我尝试使用[nsmutablearray containsObject]但它似乎没有工作。重复的项目仍会添加到数组中。你知道这里有什么不对吗?

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
    if (![_buddiesList containsObject:(__bridge id)person]) {
        [_buddiesList addObject:(__bridge id)person];
        NSLog(@"Added");
    }
    return NO;
}

3 个答案:

答案 0 :(得分:4)

没有NS等效于ABRecordRef,而-containsObject:只是在其所有对象上调用-isEqual:来确定是否已包含重复项,因此您的方法不能工作

我建议围绕ABRecordRef编写一个包装器类,并在那里实现自己的-isEqual:方法。

<强>更新
正如@omz指出的那样, 工作,因为调用了CFEqual(),谢谢!但是,在ABRecordRef周围使用包装类仍然是一个好主意。

答案 1 :(得分:2)

containsObject:调用未能报告重复的原因是NSArray使用NSObject方法-isEqual:来确定相等性,以及CF类型,例如{{1}没有这个方法。我们需要找到一种更好的方法来确定平等。

最有效的方法是使用AddressBook API的Objective-C包装器,将每条记录转换为真正的 ABRecordRef,而不是仅仅桥接它。 Jim Dovey's iPhoneContacts project是一个很好的解决方案。要在此基础上构建一个相等测试方法,只需添加一个NSObject方法,该方法使用下面显示的技术来比较记录ID。

或者,您可以保持原样,但每次要添加记录时都要对阵列进行线性扫描。像这样:

isEqual:

答案 2 :(得分:-1)

您可以尝试根据isKindOfClass检查数组对象。

例如:

if([[ buddiesList objectAtIndex:i] isKindOfClass:( _bridge id)person]){

做一些事情;

}