views:

912

answers:

6

Hello all ,

I have developed a simple location aware iPhone application which is functionally working very well to our expectations except in the low memory condition of the phone .

In low memory condition of the phone my app just got crashes and If I increases the phone memory by freeing up some space it again start working well without any crash .

when I do some googling on the problem I found that in the low memory conditions the os will send didReceiveMemoryWarning to all the controllers in the current hierarchy so that each one of them should implement didReceiveMemoryWarning method and also set nil to iboutlet for the view that is currently not visible .

I have also read somewhere that if the view for that controller is not visible the method setView with nil parameter will be called and if there are some outlet variables attached to view there will be problem in removing them.

So with all these fundas what is the best to handle low level memory condition raised by the Iphone by implementing the didReceiveMemoryWarning and viewDidUnload methods.

Please give a proper example or link if possible for the solution of the above problem .

thanks.

+2  A: 

It's up to you to decide what to do in didReceiveMemoryWarning. The OS is telling you that memory is low, and you need to free up as much as you can as soon as you can. The idea is that you should free any cached data, unload views that aren't visible, etc. The details are application specific.

richb
+1  A: 

One example i am posting...which i have copied from somwhere... it might give you some idea...

    - (void)didReceiveMemoryWarning {

    // Release anything that's not essential, such as cached data (meaning
    //instance variables, and what else...?)

    // Obviously can't access local variables such as defined in method
   // loadView, so can't release them here
     // We can set some instance variables as nil, rather than call the release
   // method on them, if we have defined setters that retain nil and release their
    //old values (such as through use of @synthesize). This can be a better
    //approach than using the release method, because this prevents a variable
    //from pointing to random remnant data.  Note in contrast, that setting a
   // variable directly (using "=" and not using the setter), would result in a
    //memory leak.
     self.myStringB = nil;
    self.myStringD = nil;
     [myStringA release];// No setter defined - must release it this way
    [myStringC release];// No setter defined - must release it this way

     /* 3. MUST CONFIRM: NOT necessary to release outlets here - See override of
    setView instead.
     self.labelA = nil;
    self.imageViewA = nil;
     self.subViewA = nil;
    */
     // Releases the view if it doesn't have a superview
    [super didReceiveMemoryWarning];
    }
mihirpmehta
Hey mihir I have iboutlets and I am loading my view from the nib file just check the comment on my question . It is confusing as the view is not visible then it will call the the viewDidUnaload so what should I do nullify the values in didReceiveMemoryWarning or viewDidUNload or setView????????
hib
but for every view there will be seperated didReceiveMemoryWarning function so implement this method regarding that particular view...in the viewDidUnload method use the corresponding accessor method to set the value of the object to nil...
mihirpmehta
+1  A: 

You could also release memory in didReceiveMemoryWarning, that you allocated for static variables in your classes. Because once the memory for static variables is allocated it'll not be freed during the application runs.

schaechtele
There's a tiny paragraph "Memory Warnings" on this page:http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html
schaechtele
+1  A: 

To my surprise, only a few apps in the official iPhone samples implement didReciveMemoryWarning. You can use the iPhoneCoreDataRecipes example as an reference.

Some samples (e.g. TableViewSuite) even do something else ;-)

ohho
+1  A: 

If you can't turn your app low memory friendly you should warn the user on low memory, ask to leave the app and free some memory so it can give the best user experience.

But if you can implement some low memory minimum functionality you should then "change mode".

Reonarudo
+1  A: 

Memory warnings are a signal to you that you should dispose of any resources which aren't absolutely critical. Most of your controllers will be hanging onto data caches, intermediary data, or other bits and pieces, often to save recalculation. When they receive memory warnings, they should begin flushing anything they don't immediately need in order to operate.

How you determine what is "critical" depends entirely on your application's design. An OpenGL game, for example, may determine that textures currently on-screen are valuable and flush textures which aren't visible, or level data which is outside the bounds of the current play area. An application with extensive session logs (like an IRC client) may flush them out of memory and onto disk.

As you observed, the warning is sent to each controller in your hierarchy, so each piece needs to determine individually what data constitutes "critical for operation" and what constitutes "expendable". If you've optimized them all and are still getting out of memory warnings, it's unfortunately time to revisit your core application design, because you're exceeding the limits of the hardware.

Dan Story
OK I have made my solution by making the outlets nil in my viewDidUnload method .
hib