2009-07-31 6 views
0

Je souhaite supprimer dynamiquement un UILabel de l'UIView. Il y a des branchements et des boucles, et à la fin quand je les supprime par 'removeFromSuperview', les plots sdk n'existent plus, dans certains cas.comment supprimer un objet seulement s'il existe sur iPhone SDK?

[lbl_timer removeFromSuperview]; 

Donc, ce que je voulais, c'est simplement savoir comment un objet existe?

grâce

Répondre

0

Vous aurez vraiment besoin de clarifier dans quel sens vous entendez par "existe" car cela peut être interprété de diverses manières.

Vous pouvez trouver que retainCount d'un objet peut satisfaire votre définition de exists dans ce cas. Si vous n'êtes pas familier avec la gestion de la mémoire d'Objective-C, sachez qu'une fois que le retainCount d'un objet atteint 0, il est désalloué et n'est plus "existant".

if ([lbl_timer retainCount] >= 1) { 
    // The object is owned/retained by at least one thing, 
    // assuming a parentview is an owner 
    [lbl_timer removeFromSuperview]; 
} else { 
    // The object isn't retained by anyone 
} 

Honnêtement, c'est pas le plus fiable ou moyen "sûr" pour vérifier.

EDIT: Le fait que l'appel de retainCount sur un objet désalloué provoque un plantage a été soulevé. Il est probablement préférable d'éviter ce type de vérification. S'en tenir à la méthode ci-dessous devrait être beaucoup plus sûr.


Si vous le savez, il se bloque spécifiquement parce qu'il ne dispose pas d'un parentview vous pourriez être en mesure de vérifier si elle a même un parentview.

if ([lbl_timer superview] != nil) { 
    [lbl_timer removeFromSuperView]; 
} 

plus: Il pourrait même être plus sûr de faire lbl_timer vous n'est pas nil'd en premier.

if (lbl_timer != nil) { 
    if ([lbl_timer superview] != nil) { 
     [lbl_timer removeFromSuperView]; 
    } 
} 
+0

Merci pour votre réponse. il y avait une vue parent, mais je voulais savoir si elle a déjà été supprimée, elle s'est écrasée lors de la deuxième suppression, je pense. J'ai changé une autre variable globale, je l'ai utilisée comme drapeau, parce que c'était urgent. Je vais regarder dans la gestion de la mémoire, et le «néant» était une nouvelle idée pour moi. merci encore – pMan

+0

Vous ne savez pas si vous pouvez appeler 'retainCount' pour les objets déjà désalloués, surtout si la mémoire a été réutilisée. – notnoop

+0

Ah, bon point. Je devrais tester ça, mais toi, ça pourrait causer un crash.Il serait probablement plus sûr de tester pour s'assurer que l'objet n'est pas éliminé en premier. – Neil

1

Si par « existe » tu veux dire « n'a pas été désallouée, » il n'y a aucun moyen de le faire. La mémoire où se trouvait l'objet a peut-être déjà été remplacée par un nouvel objet. Cependant, si l'objet a été désalloué, il doit déjà avoir été supprimé de sa vue d'ensemble, car la vue supérieure conservera une référence à celle-ci.

Si vous êtes celui qui fait la libération, vous pouvez définir lbl_timer-nil immédiatement après la sortie, de sorte que -removeFromSuperview est envoyé à un objet nul et ne fait rien. Si ce n'est pas possible, vous devriez nous montrer du code.

+0

Vous devez toujours, toujours TOUJOURS définir une valeur à zéro une fois que vous l'avez relâché pour la dernière fois. C'est principalement dans dealloc - assurez-vous que vous définissez des références à zéro. –