Получение значений CFMutableDictionaryRef - PullRequest
0 голосов
/ 26 июля 2010

Я хотел бы получить доступ к некоторым значениям из CFMutableDictionaryRef, а затем поработать с ними.Используя приведенный ниже код, мне удалось распечатать некоторые свойства моей батареи.Я также могу распечатать отдельные значения (хотя при этом я получаю предупреждение : недопустимый тип получателя: CFMutableDictionaryRef ).

Затем я пытаюсь преобразовать строковые значения в NSNumber, а затем программа выдает ошибки.Это дает мне что-то вроде нераспознанный селектор, отправленный на экземпляр 0x5d65f70 Любая помощь?

CFMutableDictionaryRef matching , properties = NULL;
io_registry_entry_t entry = 0;
matching = IOServiceMatching( "IOPMPowerSource" );
//matching = IOServiceNameMatching( "AppleSmartBattery" );
entry = IOServiceGetMatchingService( kIOMasterPortDefault , matching );
IORegistryEntryCreateCFProperties( entry , &properties , NULL , 0 );

NSLog( @"%@" , properties );


NSString * voltage = [properties objectForKey:@"Voltage"];  
NSString * currentCapacity = [properties objectForKey:@"CurrentCapacity"];  


NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * myNumber = [f numberFromString:voltage];


[f release];
CFRelease( properties );
IOObjectRelease( entry );

1 Ответ

1 голос
/ 26 июля 2010

Я также могу распечатать отдельные значения (хотя при этом я получаю предупреждение: недопустимый тип получателя: CFMutableDictionaryRef).

Это потому, что компилятор не знает, что CFMutableDictionaries также являются NSMutableDictionaries. Вам придется использовать явное приведение, чтобы сообщить компилятору, что отправка сообщений в словарь - это нормально. Либо так, либо используйте CFDictionaryGetValue вместо этого (CFMutableDictionary является подклассом CFDictionary).

Затем я пытаюсь преобразовать строковые значения в NSNumber, а затем в программе появляются ошибки. Это дает мне что-то вроде нераспознанного селектора, отправленного на экземпляр 0x5d65f70

Это поможет нам сказать:

  • Какой селектор не был распознан
  • Что за объект 0x5d65f70 был в то время
  • Какая строка вашей программы вызвала исключение (отладчик сообщит вам об этом, если вы запустите свое приложение под ним)

Можно предположить, что вы можете проверить, действительно ли объект для клавиши Voltage является строкой, зарегистрировав class объекта. Это может быть уже число. Разумно предположить, что все, что ожидает NSString, будет пытаться отправить сообщения NSString тому, что вы ему дадите, поэтому, если вы дадите ему NSNumber, вы получите отправку сообщений NSString объекту NSNumber, что является одной из возможных причин этого. исключение.

...