NSMutableDictionary против CFMutableDictionary - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть требование к словарю с ключами, которые не копируются. Это привело меня к веселому танцу, и я оказался у дверей CFMutableDictionary.

Я пытаюсь понять, насколько они взаимозаменяемы. В документах Apple для CFMutableDictionary они утверждают:

в методе, где вы видите параметр NSMutableDictionary *, вы можете передать в CFMutableDictionaryRef и в функцию, где вы видите Параметр CFMutableDictionaryRef, вы можете передать в Экземпляр NSMutableDictionary.

Но мне было интересно, можно ли привести CFMutableDictionary к NSMutableDictionary и вызвать для него методы NSMutableDictionary, и в некоторых случаях кажется, что это возможно;

Если я создаю CFMutableDictionary с помощью CFDictionaryCreateMutable () и приведу его к NSMutableDictionary.

Я могу позвонить:

[cfDictionaryCastToNSDictionary objectForKey:someKey]

Я также могу позвонить:

[cfDictionaryCastToNSDictionary setObject:someObject forKey:someKey]

... который скопирует ключ или вызовет исключение, если он не реализует NSCopying. Я также могу перебирать его значения, используя цикл for.

Однако, если я позвоню:

[cfDictionaryCastToNSDictionary count]

Я получаю исключение.

У меня вопрос, что именно здесь происходит под капотом? Документация Apple нигде не упоминает о возможности вызова некоторых методов, которые не существуют в CFMutableDictionary, путем приведения к NSDictionary.

1 Ответ

3 голосов
/ 27 сентября 2011

Если вы хотите разобраться в проблемах с использованием бесплатного моста, вам следует начать с Mike Ash's Mike Ash и перейти оттуда.

Если вы просто хотитечтобы вернуться к работе, ответ - не делай этого;полностью избежать этой проблемы, используя функции CF с CFDictionary, а не бесплатное мостовое соединение.API CFDictionary должно быть достаточно, чтобы делать все, что вы пытаетесь сделать, если словарь используется исключительно для внутреннего использования.

...