2010-01-28 5 views
1

Je crée quelques UILabels dans mon UIView, les remplissant avec des données, les ajoutant à la vue et les libérant.Mise à jour/Suppression des UILables de la vue

UILabel *speed = [self scrollLabel:@"some Text" x:455.0f y:75.0f]; 
[scrollView addSubview:speed]; 
[speed release]; 

La méthode:

- (UILabel *)scrollLabel:(NSString *)text x:(float)x_ y:(float)y_ { 

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x_, y_, 300.0f, 20.0f)]; 
[label setText:NSLocalizedString(text,@"")]; 
[label setFont:[UIFont fontWithName:@"Helvetica" size:14]]; 
[label setTextColor:[UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:1.9]]; 
[label setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]]; 

return label; 

} 

Je suis un bouton, où l'utilisateur peut recharger les données des UILabels. Je supprime la vue parent de toutes ces étiquettes de superfiew, générant les nouvelles données et faisant la méthode où les étiquettes sont définies, encore une fois. Le problème est, les anciens UILabels existent toujours, alors ma question est, quelle est la meilleure façon de supprimer ces étiquettes spéciales?

J'ai fait une boucle et supprimé toutes les sous-vues, le problème est, j'ai aussi eu d'autres sous-vues, que je ne veux pas supprimer.

Une autre question: existe-t-il une meilleure façon de configurer les styles de police pour plusieurs étiquettes?

Répondre

1

Je suggère d'ajouter toutes les étiquettes dans un UIView spécifique, appelons-le labelHolderView. Ensuite, chaque fois que vous voulez les supprimer, il suffit de parcourir tous ses enfants et appelez removeFromSuperview pour chacun d'eux.

Si vous ne souhaitez supprimer que des UILabels spécifiques, veuillez fournir plus d'informations sur leur choix.

Une chose que je suggérerais pour votre code ci-dessus: votre méthode - (UILabel *)scrollLabel:(NSString *)text x:(float)x_ y:(float)y_ devrait retourner un UILabel autoeleased. Donc, sa dernière ligne devrait être return [label autorelease];. Si vous souhaitez renvoyer un objet conservé, ajoutez new/copy/retain dans le nom de la méthode, afin que vous sachiez que l'objet renvoyé est conservé chaque fois que vous l'appelez.

Par conséquent, vous n'avez pas besoin de libérer l'étiquette après l'avoir ajoutée à UIView. Cela n'affecte pas votre programme spécifique, mais il est bon de prendre l'habitude de le faire de cette façon afin de ne pas gâcher vos retenues/versions à l'avenir.

+0

merci pour votre réponse Dimitris. D'accord, je vais ajouter ma propre vue à ma vue de défilement et la supprimer en faisant défiler les enfants de cette vue. Merci! Que voulez-vous dire par «vous n'avez pas besoin de libérer l'étiquette après l'avoir ajoutée à l'UIView». voulez-vous dire que je ne dois pas les libérer quand je retourne un objet autoreleased dans ma méthode ou généralement? quelle sera la différence si j'ajoute aussi new/copy/retain à la valeur retournée? il a un plus grand releasecount alors, ok, mais est-ce un avantage de quelque façon que ce soit? – choise

+0

Tout d'abord, votre code fonctionne bien comme il est. Vous conservez un UILabel lorsque vous le créez et vous le libérez lorsque vous l'ajoutez à une vue. C'est bien, il n'y a pas de fuite de mémoire. Ce qui est mauvais dans votre code (mais pas faux, juste une mauvaise pratique), c'est le fait que votre méthode retourne un objet retenu. Dans Cocoa, toutes les méthodes qui renvoient un objet retenu ont le mot * new *, * copy * ou * retain * dans leur nom, de sorte que le développeur qui les appelle sache qu'il doit lui-même libérer l'objet. (à suivre) – Dimitris

+0

(suite) Donc je suggérais soit de libérer automatiquement l'étiquette avant de la renvoyer OU juste de renommer votre méthode en quelque chose comme '- (UILabel *) scrollLabelCopy: (NSString *) text x: (float) x_ y : (float) y_', de sorte que chaque fois que vous l'appelez, on vous rappelle que l'objet retourné est déjà retenu *) scrollLabelCopy: (NSString *) text x: (float) x_ y: (float) y_' , de sorte que chaque fois que vous l'appelez, on vous rappelle que l'objet retourné est déjà conservé. Suivre cette convention peut prêter à confusion en commençant par la gestion de la mémoire dans Cocoa. – Dimitris

Questions connexes