MangoOfFury
MangoOfFury

Reputation: 97

UIImageView stops displaying images after a specific amount of loop iterations

My iOS app utilizes a loop to cycle through images in a folder. My application is supposed to loop through a total of 2031 images (sized 1200x900) inside a folder. The images were taken at 8fps and each image will be displayed as the loop continues to simulate a video clip. After the 696th picture, the images will cease to be displayed in the UIImageView although the app will continue looping.

I tested to see if the disconnect was because of the picture not existing I started the loop at picture 200, but after picture 896 the UIImageView stop displaying the pictures.

The Code:

imgName = [NSString stringWithFormat:@"subject_basline_mat k (%d).png",jojo];
jojo++;
imageToCrop.image = [UIImage imageNamed:imgName]; //imageToCrop is the name of the UIImageView image and it is set to the image file here
imageToCrop.image = [self imageWithImage:imageToCrop.image convertToSize:self.imageToCrop.frame.size]; //Here the image is converted to fit the bounds of the simulator which is 320x240

The code loops due to a timer that loops it about once every 0.8 seconds.

I ran my code with instruments to see if there was a memory problem occurring,and instruments is very heavy on my computer. As such, my application ran quite slowly. However, when I arrived at the 696th picture, the pictures kept displaying themselves. It was almost as if my application running too quickly caused the picture to not be displayed... which I don't really understand.

The only memory heavy part of the image switching seems to be the size conversion step which is called by the line imageToCrop.image = [self imageWithImage:imageToCrop.image convertToSize:self.imageToCrop.frame.size];

imageToCrop.image = [self imageWithImage:imageToCrop.image convertToSize:self.imageToCrop.frame.size];

The method "imageWithImage" is here:

- (UIImage *)imageWithImage:(UIImage *)image convertToSize:(CGSize)size {
@autoreleasepool {
    UIGraphicsBeginImageContext(size);
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return destImage;
}

And the line [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; uses around up the most memory out of all the image management in the app.

Any Ideas as to why my app will only display a certain amount of images?

Upvotes: 1

Views: 151

Answers (2)

azsromej
azsromej

Reputation: 1629

Try loading the full-size images from the app bundle by URL. For example:

@autoreleasepool {
    NSString *imgName = [NSString stringWithFormat:@"subject_basline_mat k (%d)",jojo];
    NSURL *imageURL = [[NSBundle mainBundle] URLForResource:imgName withExtension:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:[imageURL path]];
    imageToCrop.image = [self imageWithImage:image convertToSize:self.imageToCrop.frame.size];
}

Upvotes: 1

David Hoerl
David Hoerl

Reputation: 41652

Almost for sure your problem is [UIImage imageNamed:imgName]. There are hundreds of posts here on the pitfalls of using it. The issue is that it caches the images - its real purpose is for some small number of images in your bundle.

If you have oodles of images, get the path to the image, then get the image through a URL or file pointer. That way its not cached. Note that when you do this, you lose the automatic "get-retina-image-automatically", and so you will need to grab the appropriately sized image depending on whether the device is retina or not.

Upvotes: 1

Related Questions