2010-07-25 6 views
1

J'ai une scrollview pagination avec UIImageView à l'intérieur. À un moment donné, j'ai besoin de supprimer certaines images pour éviter les problèmes de mémoire.removefromsuperview donne juste l'erreur

Mais à tout moment je viens d'obtenir un BAD_ACCESS.

for(UIView *subview in [scrollView subviews]) { 
    if([subview isKindOfClass:[UIImageView class]]) { 
    if (([subview tag] != ActualPage) && ([subview tag] != (ActualPage - 1)) && ([subview tag] != (ActualPage+1))) 
    { 
     [subview removeFromSuperview]; 
    } 
    } 
} 

Fondamentalement, je veux supprimer tous les sous-vue sauf la page réelle, un arrière et un à l'avant.

+0

Je ne suis pas sûr, mais il semble que vous essayez de libérer un élément d'objet dans une boucle d'itération. Vous devriez essayer d'ajouter tous les sous-affichages liés à un tableau, puis appeler removeFromSuperview plus tard? – vodkhang

Répondre

0

Lorsque vous avez un accident, il est utile de poster le backtrace. L'accident se produit-il dans cette boucle ou ailleurs?

Si cette boucle s'exécute pendant l'affichage, vous enfreignez le contrat -removeFromSuperview qui stipule explicitement qu'il ne doit pas être appelé au milieu de l'affichage.

Je pourrais également imaginer un accident lié à faire muter le subviews au milieu de l'énumération.

Sans un backtrace, il est impossible de dire de façon concluante.

En général, si vous avez du code qui utilise isKindOfClass: pour un comportement comme celui-ci, vous avez une bizarrerie de conception qui devrait être réexaminée.

1

Il n'est pas recommandé de supprimer des objets de la baie sur laquelle vous effectuez une boucle. Essayez d'ajouter tous les affichages que vous souhaitez supprimer de la vue déroulante à un autre tableau, puis passez en revue tous les éléments de ce tableau et appliquez-y le removeFromSuperView.

Vous pouvez même utiliser le makeObjectsPerformSelector au lieu d'aller sur le nouveau tableau ...

EDIT:
Exemple de code:

NSMutableArray *viewsToRemove = [NSMutableArray array]; 
for (UIView *subview in [scrollView subviews]) { 
    if ([subview isKindOfClass:[UIImageView class]]) { 
     if (([subview tag] != ActualPage) && ([subview tag] != (ActualPage - 1)) && ([subview tag] != (ActualPage+1))) { 
      [viewsToRemove addObject:subview]; 
     } 
    } 
} 
[viewsToRemove makeObjectsPerformSelector:@selector(removeFromSuperView)]; 
+0

Merci. Pouvez-vous offrir un petit exemple avec makeObjectsPerformSelector s'il vous plaît? Tout ce que j'ai trouvé est pour toutes les sous-vues. – Alex

+0

J'ai modifié ma réponse ... –

Questions connexes