J'ai ce problème concret, mais si vous trouvez ma conception initiale idée folle et une meilleure suggestion, s'il vous plaît laissez-moi savoir :)Problème de libération objet à l'aide « removeFromSuperView » iPhone
J'ai un UIView qui agit comme conteneur/arrière-plan pour ajouter d'autres vues. L'important est qu'une seule vue soit présente à la fois. Donc, avant de faire tout en ajoutant des points de vue que je fais ceci:
for(UIView *v in [self.currentView subviews]) {
[v removeFromSuperview];
}
self.currentView est la vue que j'ajouter mes sous-vues à.
Après cela, j'ajouter une nouvelle UIView de cette manière:
UIView *tempView;
switch (self.currentIndex) {
case 1:
tempView = [[AView alloc] initWithFrame:frame];
[self.currentView addSubview:tempView];
[tempView release];
break;
case 2:
tempView = [[AView alloc] initWithFrame:frame];
[self.currentView addSubview:tempView];
[tempView release];
break;
default:
break;
}
De cette façon, je supprimer tous les points de vue, depuis que je relâche le droit tempView après que je l'ajoute à la self.currentView je me retrouve avec un Conserver le compte d'un sur le UIView vivant actuellement dans currentView. Tout cela semble bien, mais quand je le regarde avec des Instruments, je peux voir que chaque fois que je lance le code ci-dessus, un nouvel objet AView est alloué et l'ancien continue de traîner avec un nombre de retenue de 1, soit I Il me manque une action de rétention évidente en cours d'exécution sur mon objet ou bien le "removeFromSuperView" n'appelle pas "release" sur ma vue.
Dans la vraie vie, mes objets ne sont pas de type AView, mais de plusieurs types différents, mais de cette façon je peux tester s'il y a toujours une seule instance AView allouée. Comme je peux le lire dans la documentation "removeFromSuperView" devrait appeler "release" sur la vue, donc je suis un peu confus quant à savoir pourquoi mes vues ne sont pas libérées.
Encore une fois, peut-être que je vais à ce sujet dans le mauvais sens et les suggestions sont les bienvenues. La configuration est qu'il y a un certain nombre de bouton en bas de l'écran et lorsque l'utilisateur clique sur la vue change.
Merci pour toute aide ou pointeurs donné :)
Si une seule vue est présente à la fois, pourquoi utilisez-vous une boucle pour supprimer la vue? –
Qu'est-ce que c'est pour ... en syntaxe? Je pensais que l'objectif-c ne supportait pas ... dans. – martinr
Salut et merci les gars. La boucle for consistait principalement à tester par point d'arrêt le nombre de vues supprimées, elle ne s'exécute qu'une seule fois. Je peux voir que je change la collection en l'énumérant et que cela pourrait poser problème. Mais cela fera-t-il une différence? Le code de suppression est exécuté pour la vue unique qui vit là ... Le for..in devrait être bien :) il a travaillé jusqu'à présent. S'agit-il de la boucle qui conserve une référence à l'objet? Merci encore – RickiG