4

我开始用 Objective-C 学习编程,对 C 的了解不多。所以,iOS 6 中的桥接转换对我来说仍然有些困惑。

这是场景:

我有一个人 ABRecordID 作为“NSNumber”属性存储在 CoreData 中。稍后,我想直接访问那个人,所以我想使用这个人的 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)

4

1 回答 1

14

The是一个 32 位整数ABRecordID的同义词 (typedef) 。int32_t所以类型转换不是正确的方法。您想NSNumber使用 id 的值创建一个。

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)开头的变量。

于 2013-01-30T18:33:51.817 回答