iosobjective-cdidreceivememorywarning

What things should be released in didReceiveMemoryWarning method?


What I've done is to release anything from a view in this method, but my intuition told me I might do it wrong.

In most cases, what kind of resources should be killed in didReceiveMemoryWarning?


Solution

  • You can release anything here that you can easily recreate.

    A common idiom in iOS software is to use lazy initialization.

    With lazy init you don't initialise ivars in the init method, you do it in the getter instead after a check on wether it already exists:

    @interface ViewController ()
    @property (strong,readonly)NSString *testData;
    @end
    
    @implementation ViewController
    
    @synthesize testData=_testData;
    
    // Override the default getter for testData
    -(NSString*)testData
    {
        if(nil==_testData)
            _testData=[self createSomeData];
        return _testData;
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
    
        _testData=nil;
    }
    

    In this situation the memory for testData is initialised on it's first use, discarded in didReceiveMemoryWarning, then safely re-created the next time it's required.