title: Memory warning deallocated the viewcontroller?
body: <p>I have a main <code>UIViewcontroller</code> (vcMain) with two <code>UIViewControllers</code> subclassed from the main one. Both subclassed <code>UIViewcontrollers</code> (vcSub1/vcSub2) simply show an image and some more controls. vcSub1 and vcSub2 are displayed in a <code>UITabBarController</code>.
  I have implemented <code>didReceiveMemoryWarning</code> like this:     </p>
  
  <p><strong>vcMain:</strong></p>
  
  <pre><code>- (void)didReceiveMemoryWarning {
      [super didReceiveMemoryWarning]; 
  
      if ([self isViewLoaded] == NO) {
          // release the model, will be recreated in viewDidLoad
          [_brain release], self.brain = nil; 
      }
  }
  </code></pre>
  
  <p><strong>vcSub1:</strong></p>
  
  <pre><code>- (void)didReceiveMemoryWarning {
      [super didReceiveMemoryWarning];    
  
      if ([self isViewLoaded] == NO) {
          // will be recreated in viewDidLoad, only exists in vcSub1
          [self.zoomBrain release], [self setZoomBrain:nil];
  
          _button = nil; // autoreleased, created programmatically
      }
  }
  </code></pre>
  
  <p><strong>vcSub2:</strong></p>
  
  <pre><code>- (void)didReceiveMemoryWarning {
      [super didReceiveMemoryWarning]; 
  
      if ([self isViewLoaded] == NO) {
          // nothing in here (yet)
      }
  }
  </code></pre>
  
  <p>When I simulate the memory warning the first time everything seems to work fine.</p>
  
  <pre><code>Received simulated memory warning.
  -[AppDelegate applicationDidReceiveMemoryWarning:] [Line 81] 
  -[vcSub2 didReceiveMemoryWarning] [Line 102] 
  -[vcMain didReceiveMemoryWarning] [Line 73] 
  -[vcSub2 viewDidUnload] [Line 112] 
  -[vcMain viewDidUnload] [Line 65] 
  -[vcSub1 didReceiveMemoryWarning] [Line 150] 
  -[vcMain didReceiveMemoryWarning] [Line 73] 
  -[vcSub1 viewDidUnload] [Line 143] 
  -[vcMain viewDidUnload] [Line 65] 
  </code></pre>
  
  <p>I can do this again and again without problems. However, <strong>if I switch tabs</strong> (and thus reload the views) and simulate the memory warning again I get this:</p>
  
  <pre><code>Received simulated memory warning.
  -[AppDelegate applicationDidReceiveMemoryWarning:] [Line 81] 
  -[vcSub2 didReceiveMemoryWarning] [Line 102] 
  -[vcMain didReceiveMemoryWarning] [Line 73] 
  -[vcSub1 didReceiveMemoryWarning] [Line 150] 
  -[vcMain didReceiveMemoryWarning] [Line 73] 
  -[vcSub1 viewDidUnload] [Line 143] 
  -[vcMain viewDidUnload] [Line 65] 
  *** -[vcSub1 isViewLoaded]: message sent to deallocated instance 0x614de80
  </code></pre>
  
  <p>An <code>info malloc-history 0x614de80</code> shows that the instance is the vcSub1 viewcontroller.</p>
  
  <pre><code>Alloc: Block address: 0x0614de80 length: 192
  Stack - pthread: 0xa0425540 number of frames: 21
      0: 0x93f7f0a3 in malloc_zone_calloc
      1: 0x93f7effa in calloc
      2: 0x154a2d4 in class_createInstance
      3: 0x13165d8 in +[NSObject(NSObject) allocWithZone:]
      4: 0x13163da in +[NSObject(NSObject) alloc]
      5: 0x2bf0 in -[AppDelegate application:didFinishLaunchingWithOptions:] at AppDelegate.m:47
      6: 0x8dec89 in -[UIApplication _callInitializationDelegatesForURL:payload:suspended:]
      7: 0x8e0d88 in -[UIApplication  _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]
      8: 0x8eb617 in -[UIApplication handleEvent:withNewEvent:]
      9: 0x8e3abf in -[UIApplication sendEvent:]
     10: 0x8e8f2e in _UIApplicationHandleEvent
     11: 0x30b9992 in PurpleEventCallback
     12: 0x13d3944 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
     13: 0x1333cf7 in __CFRunLoopDoSource1
     14: 0x1330f83 in __CFRunLoopRun
     15: 0x1330840 in CFRunLoopRunSpecific
     16: 0x1330761 in CFRunLoopRunInMode
     17: 0x8e07d2 in -[UIApplication _run]
     18: 0x8ecc93 in UIApplicationMain
     19: 0x28f9 in main at main.m:14
     20: 0x2875 in start
  </code></pre>
  
  <p><strong>Why</strong> and <strong>how</strong> was my vcSub1 viewcontroller deallocated?</p>