2009-09-09 8 views
1

Quelle est la bonne façon de savoir si un objet est alloué en Objective-C?Objet Objective-C alloué

Je l'ai vu dans le code de l'échantillon (et cela semble fonctionner que si elle n'a jamais été attribué):

if (Object) {...}

J'ai aussi essayé d'installer Objet = rien, mais c'est un processus fastidieux à chaque fois, ça devient un peu ennuyeux.

Mais si j'ai un objet, et que je veux l'allouer et le relâcher plus d'une fois, quelle est la bonne façon? Merci!

Répondre

4

Il est impossible de dire si une variable pointe sur un objet valide, en plus de simplement lui envoyer un message et de voir si vous vous plantez. Les variables d'objet sont juste des pointeurs. La seule façon de dire est d'utiliser une valeur sentinelle (telle que nil). Mais cela ne devrait généralement pas poser de problème. Si cela vous cause des problèmes, c'est la preuve d'une faille dans la conception de votre application. Il n'y a aucune raison d'avoir des variables qui pourraient être initialisées ou non.

+0

Vous pouvez déclarer des variables qui ne pointent pas sur des choses, mais il ne devrait pas y avoir de situations où vous ne savez pas si elles pointent vers quelque chose ou non. Vous pouvez simplement déclarer un pointeur et ne pas le définir, en le faisant plus tard, mais vous devriez le connaître comme son set +! : D –

4

Vous devez toujours initialiser les variables d'objet à zéro si vous ne leur attribuez pas immédiatement une valeur. Ne pas le faire est pratiquement garanti pour causer un plantage à un moment donné lorsque vous essayez d'accéder à un objet non initialisé.

Ensuite, vous pouvez en effet faire

if(!object) 
{ 
    //some stuff 
} 

parce qu'un objet nul est garanti pour renvoyer un résultat booléen négatif, et tout objet qui est non nul retournera un résultat positif.

+2

Les variables statiques, globales et d'instance sont toujours initialisées à zéro; les réinitialiser serait redondant. (les remettre à zéro après avoir libéré leur contenu, cependant, est un must (sauf en dealloc bien sûr)) – rpetrich

+0

@rpetrich Pouvez-vous, s'il vous plaît, référer les documents officiels ou d'autres sources où il est dit que «statique, globale et les variables d'instance sont toujours initialisées à nil'. Je n'en ai pas entendu parler auparavant. Merci d'avance. – MainstreamDeveloper00

+1

@HarryCater Voir la documentation d'Apple sur l'allocation d'objets (http://developer.apple.com/bibliothèque/ios/# documentation/général/conceptuel/CocoaEncyclopedia/ObjectAllocation/ObjectAllocation.html #/apple_ref/doc/uid/TP40010810-CH7-SW1) et le standard C pour la documentation sur l'initialisation statique/globale – rpetrich

0

Une autre option est de regarder dans NSZombie. Il peut vous aider à identifier les zombies (pointeurs qui référencent les emplacements de mémoire qui ont été désalloués (et éventuellement réaffectés à autre chose!)), Mais vous ne le voudriez pas dans le code de production. En fonction de la complexité de votre situation, vous devrez définir la variable sur zéro immédiatement après l'avoir libérée, ou vous devrez créer une autre variable pour suivre les références vous-même. Mais tout cela ne fait que demander des ennuis.

Si vous êtes vraiment bloqué et que la variable objet est référencée par quelque chose qui ne sera pas libérée avant que vous n'en ayez fini avec l'objet, placez simplement l'objet dans le pool autorelease et faites-le avec.

0

La meilleure pratique actuelle avec les propriétés consiste à envoyer la méthode de définition nulle. Donc quelque chose comme @property (nonatomic, retain) UIButton *startButton; est relesed avec self.startButton = nil; Cela fonctionne seulement avec des propriétés de lecture-écriture. Avec les propriétés en lecture seule ou les occurrences sans setters, vous devez les définir à zéro après les avoir libérées.

Questions connexes