【问题标题】:How a view controller know when it is dismissed or popped out of the navigation controller stack?视图控制器如何知道它何时被解除或弹出导航控制器堆栈?
【发布时间】:2011-02-15 20:59:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

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

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

    编辑:以下代码引用了我下面的评论:

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

    - (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];
    }  
    

    【讨论】:

    • 嗨,我和那个人 (cong) 在同一个团队为 iphone 工作。我们的问题是我们想知道我们的视图何时弹出,因为当视图弹出时,ViewController 将被释放,我们希望保存该 ViewController 直到它完成其网络任务。因此,我们的解决方案之一是尝试保留在 dealloc
    • 如果您在启动网络任务的例程中调用“retain”,您的视图将永远不会被释放,直到您说“-release”。所以你不要等待“-dealloc”!每当网络任务返回时,您对 ViewController 说“释放”。如果它已被弹出,它将在那个时候被释放,这很好。如果它没有被弹出,事情会继续没有干扰,并且会在弹出后调用dealloc。由于现在网络没有运行,所以一切正常。
    • 我的答案中添加了代码示例
    • 非常感谢您的解决方案。我陷入了另一种思维方式:(
    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多