Как бы я подключил приведение NSNumber к ABRecordID в iOS

Я начинаю изучать программирование с 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 ответ

Решение

ABRecordID является синонимом (typedef) для int32_t который является 32-разрядным целым числом. Таким образом, приведение типов не является правильным подходом. Вы хотите создать NSNumber со значением идентификатора.

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

и позже:

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

Обратите внимание, что мосты и ARC не имеют значения при переходе в / из ABRecordId и NSNumber. Там нет использования любого из CF типы в этом случае. Вы будете знать, когда вы используете CF типы, потому что у вас будет переменная, тип которой начинается с CF (такие как CFArrayRef).

Другие вопросы по тегам