【问题标题】:what function should I implement to cleanup the view of a UINavigationController我应该实现什么功能来清理 UINavigationController 的视图
【发布时间】:2011-07-11 03:03:37
【问题描述】:

我有一个带有表格视图的UINavigationController。因为这是选择列表中的项目时的标准行为,所以我将 customViewController 推送到UINavigationControllerCustomView 出现,我在标题栏中看到我的后退按钮。

我的问题是,当我点击标题栏中的后退按钮以导航回我的列表时,我应该实现什么功能来确保在 customViewController 中创建的所有内容都被完全销毁并从内存中删除?

我尝试将我的清理代码放在自定义控制器的 viewdidunload 方法中,但是当我点击后退按钮时甚至没有输入。

(我也不确定如何表达这个问题,所以欢迎提出建议)

【问题讨论】:

    标签: iphone cocoa memory-management uiviewcontroller uinavigationcontroller


    【解决方案1】:

    UIViewControllerviewDidUnload 方法似乎是进行内存清理的好地方,即释放所有可以在viewDidLoad 或更高版本中轻松重新创建的对象。

    但不能保证视图控制器本身会被释放。 UINavigationController 可以在内部缓存对象。

    【讨论】:

    • viewDidUnload 是我尝试的第一个地方。我在那里设置了一个断点,它没有被击中
    • 哦。我没有看到你提到过,抱歉:/ 如果 viewDidUnload 没有被调用,那很奇怪......
    【解决方案2】:

    UINAvigationController 中分配的控制器将被自动删除。如果您只需要让一个人活着,请在导航控制器中全局创建详细信息控制器,而不是每次需要转到详细信息视图时,这样您将始终使用相同的控制器。您可以通过 viewDidDisappear 方法在按下返回按钮时对其进行清理。

    【讨论】:

      【解决方案3】:

      Apple 在他们的documenation 中非常清楚地解释了所有内容(带有漂亮的图片和所有内容!)。基本上,当您显示视图时使用pushViewController:animated:,当您返回时使用popViewControllerAnimated:

      使用类似的方法进入新屏幕:

      - (IBAction)goSomewhereButtonPressed:(id)sender {
          SomewhereViewController *vc = [[SomewhereViewController alloc] initWithNibName:@"SomewhereView" bundle:nil];
          [self.navigationController pushViewController:vc animated:YES];
          [vc release];
      }
      

      当按下 BACK 按钮时,它会清理您的屏幕。如果需要,Apple 建议您使用 UINavigationControllerDelegate 进行额外的设置和清理。

      将屏幕清理放在其控制器中 (SomewhereViewController)。

          - (void)viewDidUnload
      {
          [super viewDidUnload];
          // Release any retained subviews of the main view.
          // e.g. self.myOutlet = nil;
          NSLog(@"Somewhere's viewDidUnload called");
      }
      
      - (void)dealloc
      {
          [super dealloc];
          NSLog(@"Somewhere's dealloc called");
      }
      

      【讨论】:

      • 我想我的问题是我的 customViewCONtroller 中的 dealloc 函数或 viewdidunload 函数实际上并没有被调用......我不明白为什么所以也许我需要一个替代方法
      • 如果某些其他对象在您的控制器中仍有其钩子,则可能不会调用您的控制器的 viewDidUnload 和 dealloc 方法。在 viewWillDisappear: 和/或 viewDidDisappear: 中添加一些日志消息(或断点)以验证它们是否被调用。我刚刚遇到了这个问题,因为我启动了一个 NSTimer 来定期刷新我的视图内容;但是在我离开视图后,即使我在 viewDidUnload 中使其无效,计时器仍在继续触发。我不得不在 viewWillDisappear: 中使其无效,然后我看到我的 dealloc 被调用。也许你的控制器上有一个通知?
      【解决方案4】:

      我总是把我的清理代码放在 dealloc 中:

      -(void)dealloc {
         // cleanup code here
         [super dealloc];
      }
      

      【讨论】:

      • 我的 dealloc 由于某种奇怪的原因没有被执行。我想我不得不从 didpopitem 方法手动调用它,但这并不理想。
      • 确保在控制器被推送到导航控制器堆栈后释放控制器。导航控制器将保留它直到它被弹出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多