9
votes

Comment puis-je vérifier si un objet est publié?

Je dois être capable de vérifier si j'ai déjà publié une variable dans l'objectif-c. J'ai essayé de vérifier s'il est changé en null: xxx

Les résultats étaient les suivants: xxx

y a-t-il un moyen plus facile de vérifier si elle est traitée si elle est traitée. ?


2 commentaires

Ce que vous semblez demander n'est pas si l'objet a été libéré, mais plutôt si cela a été distribué.


duplicail possible de Comment déterminer si j'ai un Pointeur à un objet libéré?


4 Réponses :


8
votes

Habituellement, il ne faut pas avoir besoin de vérifier si un pointeur pointe vers un objet DealLocated: vous devez savoir :) Vos variables détiennent simplement une adresse mémoire. Si le contenu de la mémoire que la variable pointe vers est traditionnalisé, la valeur de votre variable (qui contient l'adresse) ne sera pas réglée par magie sur NIL ou NULL. Donc, vous devriez plutôt repenser votre conception si vous trouvez nécessaire de vérifier si un pointeur pourrait indiquer un espace d'adressage qui a déjà été publié / distribué.

Au cours du temps de développement, vous pouvez faire des choses comme activez Nszombies ou utiliser des instruments à trouver où les objets sont alloués ou traités.

Mise à jour 6/26/2015 : Lorsque vous utilisez affaiblissant les pointeurs sur OS X 10.7 et ci-dessus et sur iOS 5 et ci-dessus, ils seront automatiquement définis sur < code> nil lorsque l'objet référencé est libéré. Voir https://fr.wikipedia.org/wiki/automatic_reference_counting#zeroing_weak_references


0 commentaires

0
votes

Après avoir relâché un objet, la valeur de cet objet ne sera pas définie sur nil .


2 commentaires

Calling RetainCount sur l'objet détruit vous donnera un accident ou un autre comportement non défini, pas zéro.


En fait, le résultat le plus probable dans cet échantillon de code particulier est que retentaincount retournerait 1 même lorsqu'il a été distribué !



7
votes

Vous voulez probablement dire trafiquant (détruit), non publié. Être publié ne signifie pas être DealLocated , c'est le point de référence compté la gestion de la mémoire. Être libéré n'est pas un état, vous ne pouvez pas vérifier pour cela; être détruit est.

Si vous voulez dire trafiqué, non, non, il n'y en a pas. Il s'appelle la référence faible et l'objectif-c ne les a pas pour le comptage de référence. Lorsqu'un objet est distribué, rien n'est automatiquement effectué aux pointeurs; ils deviennent des pointeurs pendants.

Une technique consiste à envoyer l'objet envoyer une notification lors de la répartition, de sorte que tout ce qui détient un pointeur peut le réinitialiser à NIL.

Généralement, vous devez concevoir votre programme d'une manière dont aucun pointeur d'objet n'est utilisé à nouveau après que vous avez appelé version dessus. Dans le code de l'exemple que vous avez donné, vous ne devez pas utiliser BuildView pour autre chose, sauf attribution d'une nouvelle valeur.


1 commentaires

Il convient de noter que, à des fins historiques, cette réponse n'est plus correcte. Objective-C a des références faibles et, en fait, cela a toujours fait, avec suffisamment de piratage d'exécution. Cependant, pour la version officielle, ils ont besoin d'iOS 5 et de plus.



0
votes

0 commentaires