2010-07-26 13 views
0

Je voudrais accéder à certaines valeurs d'un CFMutableDictionaryRef et ensuite faire quelques maths dessus. En utilisant le code ci-dessous, j'ai réussi à imprimer certaines propriétés de ma batterie. Je suis également capable d'imprimer des valeurs uniques (bien que, ce faisant, j'obtiens un avertissement : type de récepteur invalide: CFMutableDictionaryRef).Obtenir les valeurs de CFMutableDictionaryRef

Ensuite, j'essaie de convertir les valeurs de chaîne en NSNumber, puis les bogues du programme. Il me donne quelque chose comme sélecteur non reconnu envoyé à l'instance 0x5d65f70 Toute aide?

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

Répondre

1

Je suis en mesure d'imprimer des valeurs uniques (bien que ce faisant, je reçois un avertissement: type de récepteur invalide: CFMutableDictionaryRef). C'est parce que le compilateur ne sait pas que CFMutableDictionaries sont également NSMutableDictionaries. Vous devrez utiliser une distribution explicite pour indiquer au compilateur que l'envoi de messages au dictionnaire est OK. Soit cela, soit utiliser CFDictionaryGetValue à la place (CFMutableDictionary est une sous-classe de CFDictionary). Ensuite, j'essaie de convertir les valeurs de chaîne en NSNumber, puis les bogues du programme. Il me donne quelque chose comme sélecteur non reconnu envoyé à l'instance 0x5d65f70

Il serait utile de nous dire:

  • Quel sélecteur n'a pas été reconnu
  • Quel genre de 0x5d65f70 objet était à l'époque
  • Quelle ligne de votre programme a provoqué l'exception (le débogueur vous dira si vous exécutez votre application en dessous)

En guise d'estimation, vous pouvez vérifier si l'objet de la clé Voltage est vraiment une chaîne en enregistrant les class de l'objet. Il pourrait déjà être un nombre. Il est raisonnable de supposer que tout ce qui attend un NSString va essayer d'envoyer des messages NSString à tout ce que vous lui donnez, donc si vous lui donnez un NSNumber, vous l'enverrez des messages NSString à un objet NSNumber, ce qui est une des causes possibles exception.

Questions connexes