如何在iOS中将NSNumber转换为ABRecordID

时间:2013-01-30 18:04:38

标签: ios abaddressbook abrecordref

我开始使用Objective-C学习编程,并且对C语言知之甚少。因此,iOS 6中的桥接渲染对我来说仍然有点混乱。

以下是该方案:

我将一个人ABRecordID存储在CoreData中作为'NSNumber'属性。稍后,我想直接访问该人,因此我想使用该人的ABRecordID来使用ABAddressBook访问该联系人信息。注意到ABAddressBookGetPersonWithRecordID需要ABRecordID,下面是我在代码中执行转换的方式......

address_book = ABAddressBookCreate();
ABRecordID rec_id = (__bridge ABRecordID)person.record_id;

然而,这没有成功,我得到了incompatible types casting 'int' into 'ABRecordID' (aka 'int') with a __bridge cast

已经混淆了,在ARC类型和CF类型之间桥接转换的正确方法是什么?

此外,在哪种情况下,我应该使用(__bridge retained)而不是(__bridge)

1 个答案:

答案 0 :(得分:14)

ABRecordIDint32_t的同义词(typedef),它是一个32位整数。因此,类型转换不是正确的方法。您想要使用id的值创建NSNumber

ABRecordId rec_id = person.record_id;
NSNumber *wrapper = [NSNumber numberWithInt:(int)rec_id];

以后:

NSNumber *wrapper = ...
ABRecordId rec_id = (ABRecordId)[wrapper intValue];

请注意,往返ABRecordId和NSNumber时,桥接和ARC无关紧要。在这种情况下,没有使用任何CF类型。您知道何时使用CF类型,因为您将拥有一个类型以CF开头的变量(例如CFArrayRef)。