对于viewcontroller,始终在pair中调用initWithNibName和dealloc

时间:2012-01-30 17:25:29

标签: objective-c viewcontroller init dealloc

如果调用viewcontroller上的dealloc,那么下次调用viewcontroller时会再次调用initWithNibName吗?

2 个答案:

答案 0 :(得分:2)

是的,但你可能会误解这段关系。 dealloc表示对象正在消失(不仅仅是离开屏幕)。 init...表示正在创建对象(不仅仅是放在屏幕上)。 init...之后的dealloc被发送到完全不同的(新创建的)对象。

人们放入initWithNibName:dealloc的许多内容实际上意味着投入viewWillAppear:viewDidDisappear:。在这里放置逻辑可确保即使重用相同的视图控制器也会调用它。

答案 1 :(得分:2)

init方法由您编写的软件调用,或通过调用[super init ...]间接调用(也由您的软件启动)。

如果您的视图控制器调用了dealloc方法,那是因为它已被释放到保留计数为零的位置。

我想知道你是否对卸载和加载视图更感兴趣。 (更新)如果是这种情况,have a look at this thread。它解释了有关loadView和viewDidLoad的一些有用的东西。更重要的是,您的所有视图设置都应该放在viewDidLoad方法中,并且所有子视图只能由主视图保留(当您使用addSubview时)。如果你这样做,那么你可以释放主视图(在didReceiveMemoryWarning中最有可能的地方)。之后,对该视图的任何引用(通过self.view)都将重新加载视图及其子视图。但是,在此过程中,视图控制器不会被释放或取消分配。

UPDATE#2您可以使用一个名为延迟加载的进程来自动分配和初始化您的视图控制器。在此方法中,您将视图控制器实例作为拥有和使用它的对象的属性。您为该视图控制器编写自己的getter方法,并在该getter中测试视图控制器是否已经实例化。如果没有,则在getter中实例化它。然后从getter返回实例。执行此操作时,请确保在释放实例时将其设置为nil。 (当你这样做时,确保它不在其他地方拥有/重新定位可能是一个好主意。

以下是这种吸气剂的一个例子:

- (MyVC*) myVC {
    if (!myVC) {
        myVC = [[MyVC alloc] initWithNib...];
        // include other things here that you might need for setting the VC up
    }
    return myVC;
}

请记住在释放时将值设置为nil。