2012-04-23 3 views
2

Я пытаюсь достичь [NSMutableDictionary dictionaryWithObjects:frames forKeys:items], но с CFDictionary, поэтому у меня есть контроль над обратными вызовами ключа и значения. Это то, что я получил:Кастинг '__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

Я тоже не смог найти синтаксис. (EDIT:. Ответ Джастина имеет синтаксис) Попробуйте вместо этого:

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

Тогда вам не нужно слепок при вызове CFDictionaryCreate.

+0

Не думал о добавлении (__unsafe_unredtained id *) раньше (void *), но это сработало для меня. Благодаря! –

0

попробуйте (__bridge const void **)keys.

+0

Несовместимые типы произнесения '__unsafe_unretained идентификатор *' к 'сопзЬ пустота **' с литором __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 ... он работает с ARC с 4.3.2 здесь – justin

+0

Вы правы. Я никогда не пробовал это * без * сдачи '__bridge' до вашего комментария. Ваши работы. С '__bridge' он терпит неудачу. –

Смежные вопросы