2012-10-23 4 views
1

Je suis en train d'utiliser retrievePeripheral de CoreBluetooth:ios: NSArray de CFUUIDRef

- (void)retrievePeripherals:(NSArray *)peripheralUUIDs; 

La documentation dit peripheralUUIDs devrait être un NSArray de CFUUIDRef. Dans l'exemple d'Apple projet temperatureSensor, il est appelé comme:

[centralManager retrievePeripherals:[NSArray arrayWithObject:(id)uuid]]; 

(UUID étant un CFUUIDRef) Lorsque j'utilise exactement le même code dans Xcode 4.5.1, iOS 6, je suis une erreur obtenir:

Cast de type pointeur C 'CFUUIDRef' (alias '__CFUUID struct const *) type de pointeur Objective-C 'id' nécessite un ponté jeté

Je dirais (bien que je suis loin d'être bien sûr) que la raison pour laquelle cela fonctionne dans TemperatureSensor et pas dans mon projet est parce que TemperatureSensor ne semble pas utiliser ARC alors que mon projet le fait.

Xcode propose 2 façons de résoudre le problème: l'ajout d'un __bridge ou en utilisant CFBridgingRelease(). je les ai essayé les deux et je suis sous l'impression que la fonction ne fonctionne pas [Modifier] parce que le délégué Methode didRetrievePeripheral: ne sera jamais appelé [/ Edit] (d'après ce que je comprends, ces opérations changeraient les structures de style C en objectifs C, créant ainsi un NSUUID, et la méthode ne peut pas l'utiliser, mais, encore une fois je ne suis pas sûr)

Donc qu'est ce que je devrais faire ? J'ai cherché sur google pour des exemples de retrievePeripherals utilisant ARC, mais sans succès.

+1

Qu'est-ce qui vous fait penser que cela ne fonctionne pas? Tout a été comblé avant donc la sémantique n'a pas changé, c'était juste plus automatique que maintenant. – borrrden

+0

On dirait que ça ne marche pas parce que la méthode didRetrievePeripheral: delegate n'est jamais appelée ... (mais peut-être que mon diagnostic est faux) –

+0

(il s'avère que c'était faux en effet) –

Répondre

1

Il s'avère que le problème était beaucoup plus simple que cela. J'ai copié/collé du code de TemperatureSensor, en particulier le DidRetrievePeripheral. Mais il s'avère qu'il y a une erreur dans ce code (c'est DidRetrievePeripheralS), donc la méthode déléguée n'est jamais appelée. Je pense que le bug est déjà signalé.

Merci/désolé

+0

Wow, cette réponse va sûrement me sauver environ 5 heures de débogage temps! Merci, Joachim! –

2

Dans le changement de capteur de température de cette ligne et exécutez

LeDiscovery.m

-(void) startScanningForUUIDString:(NSString *)uuidString 
{ 
     [centralManager scanForPeripheralsWithServices:nil options:0]; 
} 

changer le mot nil et supposons 0.

Si vous voulez plus vérifier link.

J'espère que c'est utile pour vous.