2010-02-03 4 views
1

Je veux obtenir le chemin exécutable de mon paquet. (Je veux obtenir le chemin afin que je puisse charger des images dans un NSImageView)avertissement sur nsbundle bundlepath

j'ai obtenu ceci.

NSString * _Ruta_APP = [[NSString alloc] init]; 
_Ruta_APP = [[NSBundle mainBundle] bundlePath]; 

mais le compilateur dit /ControlAPP.m:33:0 /ControlAPP.m:33: avertissement: déclaration locale de '_Ruta_APP' cache variable d'instance

mais je ne peux pas utiliser la valeur de _Ruta_APP

quelqu'un a une idée?

Répondre

1

Si vous voulez vraiment conserver le chemin dans une variable d'instance, il suffit de tuer la première ligne.

  1. Vous n'avez pas besoin de déclarer une variable d'instance dans une méthode.
  2. Vous n'avez pas besoin d'initialiser une variable avec une chaîne vide avant d'affecter une autre chaîne.
  3. Vous devez ensuite conserver les variables d'instance objet:

[_Ruta_APP autorelease];
_Ruta_APP = [[[NSBundle mainBundle] bundlePath] copy];

+0

celui-ci a fait l'affaire – Freaktor

+0

je veux dire l'autre braket et la copie. – Freaktor

+1

En fait, il y a quelques détails de cette réponse qui "ont fait l'affaire". Je suggère que vous vous efforciez de comprendre les détails des différences du code dans la réponse et votre code d'origine, sinon vous risquez de répéter les mêmes erreurs encore et encore. – bbum

1

Couple de choses:

Essayez ceci:

NSString* imagePath = [[NSBundle mainBundle] pathForResource @"SomeImage" ofType: @"png"] 

L'avertissement que vous obtenez semble indiquer que vous avez également une variable d'instance avec le même nom que cette variable locale dans votre code fragment.

Les variables d'instance avec des underscores sont probablement aussi une mauvaise idée puisque c'est ce que Apple utilise pour les ivars cachés/privés. Je pense qu'il est considéré comme un mauvais style de les utiliser dans votre propre code.

+0

Pourquoi les downvotes? c'était une bonne réponse. – kubi

+0

"Essayez ceci" signifie "contourner la vraie erreur et ne pas apprendre". Le problème de @Freaktor est clairement l'observation de la variable d'instance. Cela n'a pas été expliqué dans la première version de cette réponse. En outre, la dernière chose à propos des variables d'instance privées est fausse. –

0
  1. Il semble que vous avez une variable appelée _Ruta_APP, ainsi qu'une variable d'instance du même nom. Si vous voulez utiliser la variable d'instance, vous n'avez pas besoin de redéfinir la variable dans la méthode.

  2. La première ligne de votre snippit crée un objet que vous n'utilisez jamais et qui fuit.

Donc, je dirais qu'il suffit de retirer la première ligne de votre snippit et l'avertissement devrait disparaître.

+0

merci. mais si je l'enlève, l'avertissement ne disparaîtra pas. il semble que j'ai une nouvelle instance de l'objet nsbundle et le complicateur devient fou: P – Freaktor

0

(je veux obtenir le chemin que je puisse charger des images dans un NSImageView)

Vous n'avez pas besoin le chemin de votre exécutable pour le faire. Le moyen le plus simple est NSImage's imageNamed: method; le deuxième plus facile est ce que St3fan a suggéré.

Maintenant, nous allons passer par les problèmes dans votre mise en œuvre de la dure:

NSString * _Ruta_APP = [[NSString alloc] init]; 

Ceci déclare une variable locale nommée _Ruta_APP et initialise à tenir un objet NSString, que vous possédez parce que vous avez créé avec alloc et ne l'ai pas libéré. Cela place un objet chaîne différent dans la même variable, en remplaçant le premier. Si vous n'utilisez pas la récupération de place, alors ce premier objet est toujours vivant et vous le possédez toujours, même si vous n'avez plus le moyen de lui envoyer des messages. Ainsi, vous l'avez divulgué.

Si vous vouliez avoir _Ruta_APP comme variable d'instance, coupez la première ligne entière. C'est généralement une mauvaise idée de conserver des objets que vous ne possédez pas dans vos variables d'instance, alors prenez possession de cet objet; le mieux serait de faire une copie (après cela, vous possédez la copie) et de mettre cela dans la variable d'instance. Autrement, quand tout ce que possède l'objet original le libère, l'objet mourra, mais vous le garderez toujours; alors vous enverrez un message à un objet mort, ce qui plantera votre application. Voir the memory management rules.

Si vous vouliez avoir _Ruta_APP en tant que variable locale, pas dans d'autres méthodes, coupez la variable d'instance.

+0

je l'ai eu. Je viens de commencer avec l'objectif c il y a quelques semaines. et l'anglais n'est pas ma langue maternelle, merci pour vos conseils et je vais pouvoir déboguer tout mon code. – Freaktor

Questions connexes