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?
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
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
(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