我开始使用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)
?
答案 0 :(得分:14)
ABRecordID
是int32_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
)。