Question

Je suis un noob total à la programmation iPhone, et j'ai rencontré une exception levée que je ne peux pas envelopper la tête autour.

Contexte: L'erreur se produit dans une sous-vue personnalisée, et se produit immédiatement après le chargement du programme. Je reçois une exception levée dans la méthode drawRect surchargée. Le code de jeter l'erreur suivante:

- (void)drawRect:(CGRect)rect{
    NSNumber *points = [NSNumber numberWithInt: star.numberOfPoints];
    //HERE. Doesn't recognize selector?!
    CGPathRef t = (CGPathRef)[starPaths objectForKey:points];
 /*snip*/

starPaths est initialisé en tant que awakeFromNib NSMutableDictionary avec capacité 1.

L'exception qui devient jeté est - [NSObject doesNotRecognizeSelector:]

starPaths est déclaré dans le fichier d'en-tête pour la vue comme

    NSMutableDictionary *starPaths;

et est initialisé

- (void)awakeFromNib{
    starPaths = [NSMutableDictionary dictionaryWithCapacity: 1];
} 

Enfin, je ne l'ai pas été en mesure d'arriver à un point dans le code où ajouter des éléments avec succès au dictionnaire, étant donné que le code pour ajouter une entrée repose sur la réception d'une réponse nulle du dictionnaire pour savoir que le particulier qui entrée doit être construit.

Toutes les suggestions? Toute autre information que je devrais fournir? Toute aide serait tout apprécié, je sens que je manque quelque chose évidente, mais j'ai été le dénigrement de ma tête contre ce toute la journée avec pas de chance.

Était-ce utile?

La solution

Si vous ne la variable retain ou vous-même starPaths affecter explicitement alors il [[NSMutableDictionary alloc] initWithCapacity:1] sortira automatiquement sur la prochaine itération de la boucle d'exécution.

Vous devez faire

starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain];

ou

starPaths = [[NSMutableDictionary alloc] initWithCapacity:1];

Assurez-vous de ce que vous ne release quand plus besoin.

Autres conseils

Quelques choses à vérifier:

  • est-starPaths déclarée comme une variable d'instance NSMutableDictionary *? Vous mentionnez qu'il est initialisé. Avez-vous utilisé la méthode dictionaryWithCapacity (qui retourne un objet auto-release) ou initWithCapacity (qui doit être explicitement retenu). Pour être sûr, vous voudrez peut-être de le conserver et le libérer lorsque vous avez terminé.

  • Double-vérifiez que les fichiers d'en-tête sont correctement inclus si la déclaration de starPaths est inclus dans les fichiers de mise en œuvre qui font usage.

  • D'une manière générale si vous obtenez des erreurs de mystère, il a à voir avec la mémoire corrompue. Essayez de mettre un point d'arrêt sur la première ligne de la méthode drawRect et faire un « po starPaths » dans la fenêtre de la console de débogage pour voir ce qui est en elle et quel type d'objet l'exécution pense qu'il est.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top