0

我想从 CFMutableDictionaryRef 访问一些值,然后对它们进行一些数学运算。使用下面的代码,我设法打印了电池的一些属性。我还能够打印出单个值(尽管这样做我得到一个警告:invalid receiver type: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 );
4

1 回答 1

1

我还能够打印出单个值(尽管这样做我得到一个警告:无效的接收器类型:CFMutableDictionaryRef)。

那是因为编译器不知道 CFMutableDictionaries 也是 NSMutableDictionaries。您必须使用显式转换来告诉编译器向字典发送消息是可以的。要么,要么CFDictionaryGetValue改用(CFMutableDictionary 是 CFDictionary 的子类)。

然后我尝试将字符串值转换为 NSNumber 然后程序错误。它给了我类似发送到实例 0x5d65f70 的无法识别的选择器

这将有助于告诉我们:

  • 什么选择器无法识别
  • 0x5d65f70 当时是什么样的对象
  • 您的程序的哪一行导致了异常(如果您在其下运行应用程序,调试器会告诉您这一点)

猜测一下,您可以通过记录对象的class. 它可能已经是一个数字。可以合理地假设任何期望 NSString 的东西都会尝试将 NSString 消息发送给你给它的任何东西,所以如果你给它一个 NSNumber,你就会让它向一个 NSNumber 对象发送 NSString 消息,这是一个可能的原因例外。

于 2010-07-26T11:36:38.533 回答