0

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 );
4

1 に答える 1

1

単一の値を出力することもできます (ただし、そうすると警告が表示されます: 無効なレシーバーの種類: CFMutableDictionaryRef)。

これは、CFMutableDictionaries が NSMutableDictionaries でも​​あることをコンパイラが認識していないためです。辞書にメッセージを送信しても問題ないことをコンパイラに伝えるには、明示的なキャストを使用する必要があります。それか、CFDictionaryGetValue代わりに使用します (CFMutableDictionary は CFDictionary のサブクラスです)。

次に、文字列値を NSNumber に変換しようとすると、プログラムのバグが発生します。インスタンス0x5d65f70に送信された認識されないセレクターのようなものを私に与えます

教えていただけると助かります:

  • 認識されなかったセレクター
  • 当時、0x5d65f70 はどのようなオブジェクトでしたか
  • プログラムのどの行で例外が発生したか (その行でアプリケーションを実行すると、デバッガーがこれを通知します)

おそらく、Voltage キーのオブジェクトが実際に文字列であるかどうかは、オブジェクトのclass. すでに数字になっている可能性があります。NSString を期待するものは、与えられたものに NSString メッセージを送信しようとするので、NSNumber を与えると、NSString メッセージを NSNumber オブジェクトに送信することになります。これが考えられる原因の 1 つです。例外。

于 2010-07-26T11:36:38.533 に答える