While testing my app on an iPod Touch I started getting an out of memory crash. It turns out that when using imageNamed: iOS keeps the picture around in case it is needed later. It is supposed to remove it from memory when it needs more memory, but it is slow to do so and causes the app to crash. I replaced it with imageWithContentsOfFile: and the crashes went away.
/ Put the picture on the screen. Most will be jpegs
//NSString *pictFileName = [NSString stringWithFormat:@"%@.jpg",pictName];
NSString *pictFile = [[NSBundle mainBundle] pathForResource:pictName ofType:@"jpg"];
if ( [PICT_TYPE isEqualToString:@"png"] ) {
//pictFileName = [NSString stringWithFormat:@"%@.png",pictName];
pictFile = [[NSBundle mainBundle] pathForResource:pictName ofType:@"png"];
}
//self.imageToDisplay = [UIImage imageNamed:pictFileName];
self.imageToDisplay = [UIImage imageWithContentsOfFile:pictFile];
From the documentation for imageNamed:,
This method looks in the system caches for an image object with the specified name and returns that object if it exists…
If you have an image file that will only be displayed once and wish to ensure that it does not get added to the system’s cache, you should instead create your image using imageWithContentsOfFile:. This will keep your single-use image out of the system image cache, potentially improving the memory use characteristics of your app.
So for all of my icons that remain on the screen, e.g. microphone, speaker, checkboxes, I use imageNamed:. They are small and reused so they belong in the cache. For the main image on the screen, which is large, there will most likely be lots of other images used before it is used again. The cache will be purged before the app gets around to using it again so there is no point to putting it there in the first place.