2012-04-23 15 views
2

[NSMutableDictionary dictionaryWithObjects:frames forKeys:items]を達成しようとしていますが、私はキーと値のコールバックを制御できるようにCFDictionaryを使用しています。これは私が持っているものです:次のエラーを与える'const void **'へのキャスト '__unsafe_unretained id *'

__unsafe_unretained id keys[itemCount]; 
[items getObjects:keys range:NSMakeRange(0, itemCount)]; 
__unsafe_unretained id values[itemCount]; 
[frames getObjects:values range:NSMakeRange(0, itemCount)]; 
CFDictionaryCreate(kCFAllocatorDefault, (const void **)keys, (const void **)values, itemCount, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 

Cast of an indirect pointer to an Objective-C pointer to 'const void **' is disallowed with ARC

私はさまざまなブリッジの順列を試みましたが、私はそれを苦情なしにコンパイルすることはできません。

ご迷惑をおかけして申し訳ありません。

答えて

4

私はそれの構文を見つけることができませんでした。 (EDIT:ジャスティンの答えは構文を持っている)の代わりにこれを試してください:あなたはCFDictionaryCreateを呼び出すとき

void *keys[itemCount]; 
[items getObjects:(__unsafe_unretained id *)(void *)keys range:NSMakeRange(0, itemCount)]; 

はその後、キャストは必要ありません。

+0

(void *)の前に(__unsafe_unretained id *)を追加することは考えていませんでしたが、うまくいきました。ありがとう! –

0

try (__bridge const void **)keys

+0

互換性のないタイプがキャスト '__unsafe_unretainedのid *' から 'constのボイド**' __bridgeキャストを使った場合 – Max

1

あなたは、単にこの時点でvoid*にキャストすることができます:あなたはまた、このアプローチを検討して

CFDictionaryRef d = CFDictionaryCreate(kCFAllocatorDefault, 
         (void*)keys, 
         (void*)values, 
         itemCount, 
         &kCFTypeDictionaryKeyCallBacks, 
         &kCFTypeDictionaryValueCallBacks); 

const void* keys[itemCount]; 
CFArrayGetValues((__bridge CFArrayRef)items, CFRangeMake(0, itemCount), keys); 
const void* values[itemCount]; 
CFArrayGetValues((__bridge CFArrayRef)frames, CFRangeMake(0, itemCount), values); 

CFDictionaryRef d = CFDictionaryCreate(kCFAllocatorDefault, 
             keys, 
             values, 
             itemCount, 
             &kCFTypeDictionaryKeyCallBacks, 
             &kCFTypeDictionaryValueCallBacks); 
+0

キャストはARC(Xcode 4.3.2以降)では動作しません。また、キャストはCFDictionaryを使用してコールバックを変更できるようにしたいと説明しました。 –

+0

@robmayoff hmm ... 4.3.2でARCを使用しています。 – justin

+0

あなたは正しいです。あなたのコメントまで '__bridge'を入れないで*試したことはありませんでした。あなたのキャスト作品。 '__bridge'では失敗します。 –

関連する問題