2012-04-23 56 views
2

我試圖實現[NSMutableDictionary dictionaryWithObjects:frames forKeys:items],但使用CFDictionary,因此我可以控制鍵和值回調。這是我得到的:Casting'__unsafe_unretained id *'to'const void **'

__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

我還沒有找到它的語法。 (編輯:賈斯汀的回答有語法)試試這個:

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

然後當你調用CFDictionaryCreate你並不需要強制轉換。

+0

沒有想到在(void *)之前添加(__unsafe_unretained id *),但它對我有用。謝謝! – 2012-05-04 17:22:26

0

嘗試(__bridge const void **)keys

+0

不兼容類型的鑄造 '__unsafe_unretained ID *' 到 '常量無效**'用__bridge轉換 – Max 2012-04-23 01:43:37

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,因此他可以更改回調。 – 2012-04-23 07:33:25

+0

@robmayoff嗯......它使用ARC與4.3.2在這裏 – justin 2012-04-23 07:36:49

+0

你是對的。我從來沒有真正嘗試過*沒有*直接在你的評論中加入__bridge。你的演員工作。 '__bridge'失敗。 – 2012-04-23 07:41:29

相關問題