【问题标题】:For a viewcontroller, are initWithNibName and dealloc always called in pair对于视图控制器,initWithNibName 和 dealloc 总是成对调用
【发布时间】:2012-01-30 17:25:28
【问题描述】:

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

【问题讨论】:

    标签: objective-c viewcontroller init dealloc


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      下面是这样一个 getter 的例子:

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

      释放时记得将值设置为 nil。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多