Wicketman
Wicketman

Reputation: 15

Object leak : Adding and removing UIImageView to a UIScrollView

I'm trying to dynamically add Images to a ScrollView. Before adding I check if there are any subviews in the ScrollView and delete them in a for loop.

When I release the imageview I get a runtime error stating i'm trying to acces a deallocated instance. If I remove the release statement the application will run correctly but "build and analyze" shows a leak because th reference count of imageview is not decreased..

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)];

Any suggestions about the memory leak or general best practices for adding and removing views from an array into a scrollView are much appreciated!

Upvotes: 1

Views: 1538

Answers (1)

tia
tia

Reputation: 9718

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

is wrong, because you are removing subview from subviews array. Do reverse iteration would fix that, but I would suggest keeping the view in separated array instead.

Upvotes: 1

Related Questions