2010-11-06 5 views
1

J'essaie d'ajouter dynamiquement des images à un ScrollView. Avant d'ajouter je vérifie s'il y a des sous-vues dans le ScrollView et les supprime dans une boucle for. Lorsque je lance l'imageview, j'obtiens une erreur d'exécution indiquant que j'essaie d'accéder à une instance désallouée. Si je retire la déclaration de libération de l'application fonctionnera correctement, mais « construire et d'analyser » montre une fuite, car e compte de référence de imageview ne diminue pas ..Fuite d'objet: ajout et suppression de UIImageView à un UIScrollView

if ([scrollView.subviews count]>0){ 
    for (int i=0; i<[scrollView.subviews count]; ++i) { 
     [[scrollView.subviews objectAtIndex:i] removeFromSuperview]; 
    } 
} 

//Making a scroller with results 
int scrollWidth = 0.0f; 
int scrollHeight = 0.0f; 
for (int i = 0; i<previewImages.count;++i) 
{ 
    UIImage *image=[previewImages objectAtIndex:i]; 
    scrollWidth = scrollWidth + image.size.width; // Width of all the images 
    if (image.size.height > scrollHeight)scrollHeight= image.size.height; // Maximum image height 
    [image release]; 
} 

float xC = 0.0f; 
for (int i=0; i<previewImages.count; ++i) { 

    UIImage *image=[previewImages objectAtIndex:i]; 
    UIImageView *imageview = [[UIImageView alloc] initWithFrame:CGRectMake(xC, 0.0f, image.size.width, image.size.height)]; 
    UILabel *subScript = [[UILabel alloc] initWithFrame:CGRectMake(xC, image.size.height-30.0f, image.size.width,30.0f)]; 

    subScript.textColor = [UIColor whiteColor]; 
    subScript.backgroundColor = [UIColor colorWithWhite:0.5f alpha:0.5f]; 
    subScript.text = [imagePaths objectAtIndex:i]; 

    imageview.image = image; 

    xC = xC + image.size.width; 
    [image release]; 
    [scrollView addSubview:imageview]; 
    [imageview release]; 
    [scrollView addSubview:subScript]; 
    [subScript release]; 
} 
[scrollView setContentSize:CGSizeMake(scrollWidth , scrollHeight)]; 

Toute suggestion au sujet de la fuite de mémoire ou les meilleures pratiques générales pour ajouter et supprimer des vues d'un tableau dans un scrollView sont très appréciés!

Répondre

1
if ([scrollView.subviews count]>0){ 
    for (int i=0; i<[scrollView.subviews count]; ++i) { 
     [[scrollView.subviews objectAtIndex:i] removeFromSuperview]; 
    } 
} 

est incorrect, car vous supprimez la sous-vue du tableau des sous-vues. L'itération inverse corrige cela, mais je suggère de garder la vue dans un tableau séparé à la place.

+0

Salut Tia, merci pour la réponse rapide. Je comprends ce que vous dites à propos de l'itération inverse pour vider le tableau, mais pourriez-vous élaborer sur votre deuxième remarque? En outre, cela n'a pas résolu la fuite de mémoire. – Wicketman

+0

Je veux dire garder la vue dans NSArray privé après init vos vues, donc vous possédez le tableau alors c'est plus facile à gérer. A propos de la fuite, je ne vois rien de mal avec votre extrait de code. Êtes-vous vraiment sûr qu'il y a une fuite? Comment l'avez-vous testé? – tia

+0

J'ai utilisé NSZombiesEnabled, qui me montre dans la console de débogage: *** - [UIImage release]: message envoyé à l'instance libérée. – Wicketman

Questions connexes