2013-04-11 1 views
1

Я получаю что-то странное, чего я не могу получить. Я использую элемент управления thirdy стороной (https://github.com/brunow/TableKit.m) и это сделать:Что его __NSDictionaryM. Почему NSStringFromClass не возвращает NSMutableDictionary?

+ (NSSet *)cellMappingsForObject:(id)object mappings:(NSDictionary *)mappings { 
    NSString *objectStringName = NSStringFromClass([object class]); 
    return [mappings objectForKey:objectStringName]; 
} 

Это создает картированию в имени класса:

[TKCellMapping mappingForObjectClass:[NSMutableDictionary class] block:^(TKCellMapping *cellMapping) { 
//CODE 
}]; 

И проверить объекты DataSource против него отображения. Объекты строить для меня, как:

while ([rs next]) { 
    NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 

    for (NSString *fieldName in [props allKeys]) { 
     //CODE     
     [dict setValue:fieldValue forKey:fieldName]; 
    } 
    [list addObject :dict]; //<--This is the datasource. The map is against each dict 
} 

Итак, везде я говорю это NSMutableDictionary. Но потом это странное дело.

Когда он называет NSStringFromClass([NSMutableDictionary class]), он говорит NSMutableDictionary, но когда он называет NSStringFromClass([rowDict class]), он говорит __NSDictionaryM!

Почему это случилось? Я проверяю заголовок __NSDictionaryM и Xcode перейдите к NSMutableDictionary (?). Я не могу создавать объекты с __NSDictionaryM.

BTW, что мне нужно для замены NSStringFromClass, чтобы получить точно NSMutableDictionary?

ответ

9

Это частный подкласс NSMutableDictionary. Он является a NSMutableDictionary. Read more about class clusters here.

+0

@ user529758 Будет ли приложение отклонены, если мы сравним имя класса таким способом (т.е. с частным подклассу NSMutableDictionary). ? Например, '[@" __ NSDictionaryM "isEqualToString: NSStringFromClass ([obj class])]' –

0

я сделал это с чеком подкласса:

if([[o class] isSubclassOfClass:[NSMutableDictionary class]]) { 
    // o is at least a subclass of NSMutableDictionary 
}