几个问题:UIViewController的生命周期;发布vs设置为零

时间:2009-10-23 19:44:28

标签: objective-c cocoa-touch

我有几个与UIViewController有关的问题:

1)UIViewController调用的每个方法是什么时候?具体来说,viewDidLoad,viewDidUnload和dealloc。

之间的区别

2)当设置指针等于nil并释放指针时,一般有什么区别?我知道在viewDidUnload中你应该将它设置为nil但是在dealloc call release中。

更新:对不起,刚才意识到这个问题很容易引起误解。而不是dealloc,我的意思是 - 什么时候是initWithNibName:bundle:和release?只有一次IB,对吧?

2 个答案:

答案 0 :(得分:1)

将指针设置为nil不会释放它指向的内存。

当您执行类似

的操作时
self.pointer = nil;

通常情况下属性具有retain属性。在这种情况下,将属性设置为nil将间接导致

[pointer release];
pointer = nil;

对于视图控制器方法,在从nib或以编程方式加载视图时调用viewDidLoad。更具体地说,它只是在调用-loadView之后调用。您不需要手动调用loadView,系统将执行此操作。如果发生内存警告,则会调用viewDidUnload方法,并且视图控制器的视图不在屏幕上。随后,将根据需要再次调用loadView和viewDidLoad。

正常情况下,当对象的保留计数达到0时,将调用dealloc方法。

答案 1 :(得分:1)

pointer = nil; // just clears the variable in which you store the pointer, but does not free memory.

[pointer release]; // just frees the object (memory), but does not clear the variable used to point to it.

self.pointer = nil; // sets the variable to nil.  Also releases the object ONLY if pointer is a @property(retain) ivar.

查看调用各种方法的一种简单方法是在UIViewController中执行此操作:

- (void)viewDidLoad
{
    NSLog(@"MyViewController::viewDidLoad");
    [super viewDidLoad];
    // the rest of your viewDidLoad code, here.
}

// Etc., for the other methods of interest.

注意:可以通过覆盖保留和放大来收集更多信息。释放以记录,然后在调试器中跟随。