4

私は Objective-C でプログラミングを学び始めましたが、C の知識はあまりありません。そのため、iOS 6 でのブリッジ キャスティングは、いまだに少し混乱しています。

シナリオは次のとおりです。

「NSNumber」属性として CoreData に格納されている人物 ABRecordID があります。後で、その人に直接アクセスしたいので、その人のABRecordIDを使用して、ABAddressBookを使用して連絡先情報にアクセスしたいと思います。ABRecordIDがABAddressBookGetPersonWithRecordID必要であることに気付きました。以下は、コードでキャストを実行する方法です...

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

は32 ビット整数ABRecordIDのシノニム (typedef) です。int32_tしたがって、型キャストは適切なアプローチではありません。NSNumberid の値でを作成します。

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で始まる変数があるため、いつ型を使用しているかがわかります。CFCFArrayRef

于 2013-01-30T18:33:51.817 に答える