我正在尝试将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;
}
答案 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]){
做一些事情;
}