2011-05-10 1 views
2

J'ai cette méthode qui est appelée à partir d'une autre classe:Variable d'instance est hors de portée à l'intérieur méthode

-(void)artworkInfo:(NSNumber *)pos{ 
    [image setImage:(UIImage *)[[mainDelegate.mapAnnotations objectAtIndex:(NSUInteger)pos]image]]; 
    [pos release]; 
} 

Je mets stop-points de débogage sur les trois lignes. Lors du débogage, juste après l'appel de la méthode et avant l'appel de setImage, passez la souris sur pos dans la définition de la méthode et dans la ligne setImage affiche la valeur correcte qui a été envoyée à partir de l'appel de méthode. Mais, quand j'avance dans le débogueur et la ligne suivante [image setImage...] s'exécute planant sur les deux pos s montre "hors de portée", et l'application, par conséquent, n'affiche pas l'image qu'il devrait. Pourquoi cela arrive-t-il?

EDIT: Eh bien, il semble que mon problème peut-être dans la façon dont la méthode est appelée dans la classe, parce que même une valeur hardcoded ne produit pas l'image dans la méthode, mais si je copier et coller cette ligne dans viewDidLoad:, c'est le cas. Pourquoi cette ligne fonctionnerait-elle dans viewDidLoad:, mais pas quand elle est appelée dans la méthode dans laquelle elle se trouve maintenant?

Répondre

1

Vous ne devriez pas publier un objet passé en paramètre dans une méthode, c'est une mauvaise pratique. Et vous ne devez pas convertir un objet NSNumber en un type NSUInteger.

Vous voudrez peut-être quelque chose comme ...

[pos intValue]//This will return the integer value of pos. 
+0

Merci, je pense que c'est ce que je veux. Malheureusement, il semble que ce n'était pas vraiment le problème:/J'ai édité ma question avec ce qui ne va pas encore. – Ryan

0

Peut-être que l'image à l'intérieur mapAnnotations a été libéré avant. Je ne sais pas pourquoi vous libérez pos, car c'est un paramètre donc il a une autorelease implicite. Essayez de retirer que [pos release]

1

Quelques observations:

  1. Vous devriez toujours conserver les objets que vous recevez.
  2. Vous ne devez pas convertir NSNumber en NSUInteger. Utilisez [pos intValue] pour obtenir la valeur entière.
  3. Vous ne devriez pas relâcher pos dans une situation comme celle-ci, sauf si vous l'avez explicitement conservé.
+0

Que voulez-vous dire "Vous devriez toujours conserver les objets que vous recevez"? Je ne vois rien qui devrait évidemment être retenu ici (bien que la 'libération' soit certainement fausse comme vous le dites). – Chuck

+0

Cela peut être un cas de préférence personnelle, mais si une méthode reçoit une référence d'objet, la première chose que je fais est de la conserver. Je le libère ensuite à la fin de la portée de la méthode. – csano

+0

Pour être honnête, cela me semble être une inefficacité inutile. Si vous avez réellement besoin de le faire, c'est symptomatique d'un plus gros problème avec votre gestion de la mémoire. Ce n'est certainement pas normal - regardez n'importe quel code d'Apple ou code open-source des principaux développeurs de Cocoa et vous verrez que ce n'est pas fait. – Chuck