视图控制器如何知道它何时被解除或弹出导航控制器堆栈?

时间:2010-05-05 10:33:28

标签: iphone objective-c

我的视图控制器需要知道它何时从导航控制器堆栈中弹出,以便它可以保留自己,等待并稍后通过另一个通知释放自己。

我打算在发送视图时发送dealloc消息:

- (void)dealloc {
    if (self.isPerformingSomeTask) {
        self.isPopedOut = YES;
        [self retain];
        return;
    }
    [super dealloc];
}

但我认为这不是一个好的解决方案?

1 个答案:

答案 0 :(得分:4)

这是一个非常糟糕的主意。

  1. “ -​​ dealloc”不是保留解除分配对象的地方。如果你想绝对确定你的物体没有被释放,那么在建造时保留它,例如在“-viewDidLoad”
  2. “ -​​ dealloc”不是检测从导航堆栈弹出视图的方法。您可以因任何原因被解除分配,或者即使您从堆栈中弹出也可能会延迟解除分配
  3. 如果您想检测到视图不再显示,您应该查找“-viewWillDisappear:”
  4. 教皇与此无关,所以不要强调你的观点: - )
  5. 如果您需要某个对象来接收长时间运行任务的结果,可能您的AppDelegate是一个更好的接收器,而不是视图控制器
  6. 编辑:以下代码引用我的评论如下:

    所以你的代码应该是这样的

    - (void) startMyLongTask {
      [self retain];
      // start the task
    }
    
    - (void) longRunningTaskReturns {
      // process results
      [self release];
    }
    
    - (void) dealloc {
      // as long as longRunningTaskReturns is not called
      // you will never come here
      [super dealloc];
    }