2009-08-13 4 views
1

J'ai une application qui semble fonctionner sans problème en utilisation normale. L'analyseur statique Clang ne signale aucun problème non plus. Lorsque j'essaie de l'exécuter dans Instruments, il échoue avec une exception de sélecteur non reconnue.L'application iPhone fonctionnant dans Instruments échoue avec un sélecteur non reconnu

La ligne incriminée est un simple poseur de propriété du formulaire:

self.bar = baz; 

Pour comprendre ce qui se passe, j'ai ajouté un NSLog() appelez immédiatement au-dessus:

NSLog(@"class = %@ responds = %d", [self class], [self respondsToSelector:@selector(setBar:)]); 
self.bar = baz; 

Sur la émulateur (sans instruments) et sur un périphérique, cela montre exactement ce que je m'attendais:

class = Foo répond = 1

Lors de l'exécution en vertu des instruments, je reçois:

class = Foo répond = 0

Je suis perplexe quant à ce qui pourrait causer cela. Peut-être un emplacement de mémoire différent est-il attaqué quand il est dans l'environnement Instruments? Quelqu'un peut-il suggérer comment je pourrais déboguer cela?

Répondre

0

Si la barre appartient à vous-même, ne pouvez-vous pas faire bar=baz;?

+0

Cela ne notifiera aucun observateur de la propriété, et il est possible que la barre ne soit même pas directement implémentée en tant que variable d'instance. Il peut être synthétisé à partir d'autres valeurs. Par exemple, une propriété "fullname" peut être stockée dans les ivars "firstname" et "lastname" et ne pas avoir d'ivar directement sauvegardé. –

0

Vérifiez vos propriétés. Peut-être que vous avez besoin d'un casting sur baz?

0

Il n'y a pas assez d'informations ici pour savoir ce qui se passe, mais ensuite, si vous saviez quelle information fournir, vous l'auriez probablement déjà corrigée. Alors. Quelques points à vérifier:

  • Le pointeur "self" est-il en train de basculer de quelque façon que ce soit? Essayez d'imprimer la valeur de self à différents points pour des raisons de santé mentale
  • Lorsque votre code s'exécute dans Instruments, est-il exécuté dans un mode différent? (32 bits vs 64 bits, Garbage collecté vs Retain-Release, etc.) Je ne suis pas sûr de savoir pourquoi cela aurait un effet, mais si cela fonctionne dans un mode différent, c'est quelque chose à examiner.
  • Est-ce que vous synthétisez correctement le setter? Ou est-il fourni dynamiquement (via Core Data, etc.)? Si vous spécifiez manuellement une méthode setBar:, recevez-vous toujours l'erreur?