如何在iOS中将NSNumber转换为ABRecordID

Kan*_*ann 4 abaddressbook ios abrecordref

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

这是场景:

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

address_book = ABAddressBookCreate();
ABRecordID rec_id = (__bridge ABRecordID)person.record_id;
Run Code Online (Sandbox Code Playgroud)

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

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

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

rma*_*ddy 14

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

ABRecordId rec_id = person.record_id;
NSNumber *wrapper = [NSNumber numberWithInt:(int)rec_id];
Run Code Online (Sandbox Code Playgroud)

然后:

NSNumber *wrapper = ...
ABRecordId rec_id = (ABRecordId)[wrapper intValue];
Run Code Online (Sandbox Code Playgroud)

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