2012-09-05 22 views
9

可能性の重複:
How to make an CFArrayRef to an NSMutableArrayCFArrayRefをNSArrayに変換するには?

私はこの質問について非常に多くの情報があると知っているが、一つ一つの答えは、これは簡単で、」あるあなたはフリーダイヤルのブリッジとしてキャスト行うことができます。 。 "、実際のソースコードについては言及していません。 フリーダイヤルとキャストの平均を知っています。 正確なソースコードを知りたいですか?「CFArrayRefをNSArrayに変換する方法は?」 。 誰でもどうぞ!!!!!!

答えて

5

あなたはそれをキャストすることができるはずです:ルールが少し変化するため

CFArrayRef *myLegacyArray = ... 

... 

NSArray *myArray=[(NSArray *)myLegacyArray copy]; 
+0

ありがとうございます!私は今しよう! – user1574429

+1

コピーする必要はありません。無料のブリッジキャストは文字通り 'NSArray * myNsArray =(NSArray *)myCfArray;' – jjv360

+0

です。これは非ARCコードでのみ機能します。 –

37

さて、まずあなたは、あなたがARCかを使用している場合は知っている必要があります。次に、キャストで実際に何をしたいのかを知る必要があります。その値を使用したい、または所有権を譲渡したいだけですか?

私は、すべての新しいコードが実際にARCを使用する必要があります(そしてARCはキャスティングの問題がより一般的です)ので、私はARCとみなします。

CFArrayRef someArrayRef = ...; 
NSArray *array = (__bridge NSArray*)someArrayRef; 

上記のコードは、現在のコンテキストで使用することができるNSArray*にCF参照をキャスト。所有権の移転は行われていない。 someArrayRefには参照がまだ残っていますが、手動でsomeArrayRefを手動でリリースする必要があります。

CFArrayRef someArrayRef = ...; 
NSArray *array = CFBridgingRelease(someArrayRef); 

このコードでは、キャストを取得するだけでなく、所有権の移譲も取得できます。 someArrayRefは参照を保持しなくなりましたので、手動で解放する必要はありません。代わりに、arrayが解放されると、オブジェクトはdeallocになります(他の場所では他の参照がないと仮定します)。

+0

CFBridgingReleaseはARC環境に入る方法です。常にNSに転送し、CFBridgingReleaseを使用する –

関連する問題