2012-04-14 64 views
1

我需要释放我的navigationViewController上的mainViewController的视图,以避免我收到的内存警告。UIViewController视图 - > loadView vs viewWillAppear

加载视图的好习惯是在'loadview'方法中,但是当我尝试释放视图(当我转到堆栈的下一个控制器时)执行“self.view = nil”时,它再次调用'loadview'方法,所以没有任何反应。

我解决了这个问题加载视图中的“viewWillAppear中”的方法,但是,我的问题是:

是该程序是否正确? 如果不是(这就是我的想法)我如何释放该视图以释放其内存?

哪种方法可以做到最好(或更正确)?

这是代码:

'的loadView' 没有加载视图

- (void)loadView 
{ 
    [super loadView]; 
    (some more code) 
} 

正是在这里装

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    if (!pral) 
    { 
     pral = [[TouchDrawView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
      [self setView:pral]; 
      [pral release]; 
    } 
     (some more code) 
} 

这是调用的下一个的viewController视图堆栈

- (void)menus:(id)sender 
{ 
    opcions *ops = [[opcions alloc] init]; 
    [[self navigationController] pushViewController:ops animated:YES]; 
    [ops release]; 

//Here I'm trying to free memory releasing the view 
    [pral removeFromSuperview]; 
    pral = nil; 
    self.view = nil; 
} 

谢谢

回答

0

构建自定义子视图的更好的钩子是viewDidLoad。

最小的情况下,您应该释放didReceiveMemoryWarning和dealloc中的保留子视图(pre-ARC)。

当您推送到新的viewController时不需要释放。你的旧的还在那里,在下面。

+0

是的,我的老人在那里,但是没有必要为了消耗内存资源而放在那里,不是吗? (它不在屏幕上)。所以,如果我理解得很好,在收到内存警告时不做任何事情和“反应”是一种很好的做法吗? – Kanick 2012-04-14 17:04:55

+0

接收到内存警告(会触发viewDidUnload)是可以的,因为直到你收到警告,你没有内存问题,所以没有必要处理东西。如果您在不需要时处理某些内容,则可能会产生其他问题,例如需要重新载入所有内容(=延迟)或更糟糕的情况,从而丢失难以重新载入的信息(可能来自其父VC) 。 – SomaMan 2012-04-14 17:45:39

+0

@SomaMan,是的,这是有道理的。感谢所有这些快速回复。 – Kanick 2012-04-14 18:09:21

0

你不必卸载视图,因为它自动卸载。你只需要在ViewdidUnload方法中释放那些包含内存的对象。

+0

是的,但我认为ViewDidUnload不会被调用(在简单的naviagationController应用程序中),除非视图由于内存警告而被卸载。我试图避免这种情况。 – Kanick 2012-04-14 16:59:24