views:

39

answers:

3

Hello

I have a navigation based App with 5 ViewControllers. After inspecting the memory allocation with instruments i found out that memory is increasing permanently. The app starts up with 2 MB and after navigating through all 5 Navigationcontrollers it grows up to 10 MB and counting... For every allocated object there is a corresponding release in my code (in dealloc or somewhere else), so obviously there are no memory leaks. Instruments also tells me that no memory leaks could be found.

How can I solve this memory problem? At some point of time, after navigating through the views forward and backward an out of memory warning occurs and the background image disappears (I do not deallocate the image so the iphone does it on its own).

How can i determine the source of the "memory leak" problem? Is it possible that images are cached somewhere and hold in memory as long as the app is alive?

I always alloc images like this:

UIImage *kaufpreisImage = [[UIImage alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"kaufpreis_background_green18px" ofType:@"png"]];

The images are under the Resource folder.

I would very much appreciate your help! I can't find a way out of this!

Thank you very much in advance

Regards Phil

Edit:

The only problem remaining is when I try to send an email. I want to send an email which contains multiple html tables and images inside the email body. The images are base64 encoded. After sending multiple mails I recieve an out of memory warning, although I dealloc all the stuff (images, Numbers and so on) inside the sendMail() method.

Does anyone know if sending base64 encoded images leads to problems? Can anyone give me a hint how I can send images inside the emailbody (e.g. as background image inside a html table like style="background-url(data:image/png;base64,%@)")? To clearify, this works. The images are sent to the Client (tested on MacOS) but sometimes the memory problem occurs...

Thank you very much

A: 

You need to release those images once you take ownership of them.

jer
A: 

Maybe you shall try the 'Heapshot' function in the Allocation tool. Simply take a 'Mark Heap' when your first controller is started then navigate on and again back. Take another heapshot. Repeat this process 8-10 times. In the heapshots list you shall see that some memory has been allocated between an heapshot and the following one (otherwise if the amount is small and tends to zero it is normal), try to inspect it in order to check if you allocate something that remains alive.

rano
Thanks for the advice. I'll give it a try.I moved the image creation to a singleton class which instantiates the images on demand, but only once. These changes seem to work. The memory allocation decreased drastically. Although, it seems kind of strange that I released the images in the corresponding ViewController's dealloc method and the memory did not decrease on its own.
Philipp Noggler
A: 

You are responsible for releasing the instances of UIImage if you have used [[UIImage alloc] init...] to create them.

If you are loading images from the main bundle, try using +(UIImage *)imageNamed:(NSString *)name. This UIImage returned is returned autoreleased, so you don't have to release, and there is the upside that UIKit handles caching when using the imageNamed method.

Jerry Jones
I did release the Images in the dealloc method, but I think that those remain in cache somewhere. Is that possible?
Philipp Noggler