【问题标题】:how to call (void)viewDidUnload function ? it not calling when I move to other view-controller如何调用 (void)viewDidUnload 函数?当我移动到其他视图控制器时它没有调用
【发布时间】:2013-11-15 00:40:21
【问题描述】:

enter code here我有两个视图控制器。当我从一个视图控制器移动到另一个视图控制器时,(void)viewDidUnload 函数不会自动调用。 所以它增加了我对应用程序的内存分配。在这些视图控制器之间移动 2.3 次后,我的应用程序卡住了。

当我使用 ios7 模拟器时,它没有卡住。 如何释放未使用的内存?当我移动到第二个视图控制器时,如何自动调用 (void)viewDidUnload 函数?

按钮点击事件

[self performSegueWithIdentifier:@"linktoviewmeetingitem" sender:tableView];

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"linkquicksearch"]) {
        ViewControllerSearch *searchScreen = [[ViewControllerSearch alloc] initWithNibName:@"ViewControllerSearch" bundle:nil];
        searchScreen = (ViewControllerSearch*)segue.destinationViewController;
        [searchScreen setSearchString:_txtSearch.text];
        searchScreen = nil;
    }
}

【问题讨论】:

  • 如何在这些视图控制器之间导航?显示一些代码。
  • 此方法在 iOS6 中已被弃用...甚至在那时 viewDidUnload 仅在您的 viewController 被释放时调用,而不是在转换到另一个视图控制器时调用。 - 你听起来好像是在错误地转换,分配初始化一个已经实例化的控制器。

标签: ios objective-c


【解决方案1】:

此方法在 iOS6 中不推荐使用 ...甚至在那时 viewDidUnload 仅在您的 viewController 被释放时调用,而不是在转换到另一个视图控制器期间/之后。 - 每次“转换”时都在实例化一个已经实例化的 viewController - 导致内存问题。

您需要将 viewController 的 [alloc init] 包装在 if 语句中,以检查该 viewController 实例是否已经存在。

来自文档: viewDidUnload 当控制器的视图从内存中释放时调用。 (在 iOS 6.0 中已弃用。在内存不足的情况下不再清除视图,因此永远不会调用此方法。) - (void)viewDidUnload 讨论 在 iOS 5 及更早的版本中,当发生内存不足且不需要当前视图控制器的视图时,系统可以选择在视图控制器的视图释放后调用此方法。这种方法是您执行任何最终清理的机会。如果您的视图控制器存储了对视图或其子视图的单独引用,您可以使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但在视图消失后不再需要的任何对象的引用。您不会使用此方法发布用户数据或任何其他无法轻松重新创建的信息。 在 iOS 6 及更高版本中,不需要清除视图控制器中对视图和其他对象的引用。 在调用此方法时,视图属性为 nil。

【讨论】:

    【解决方案2】:

    仅仅因为您离开视图控制器,它不会被卸载。如果您想在视图控制器被导航离开时捕获事件,请使用

    - (void)viewWillDisappear:(BOOL)animated;
    

    函数如果你想在发生之前捕获它或者

    - (void)viewDidDisappear:(BOOL)animated;
    

    如果你想在之后赶上活动。

    【讨论】:

    • 如何从内存中删除当前视图控制器?
    • ARC 会在没有强引用指向它时自动释放它。这意味着如果您弹出一个视图控制器,它可能会从内存中删除。但是如果你把另一个推到它上面就不会了。
    【解决方案3】:

    基本上在 iOS7 和 ARC 上从来没有人使用- (void)viewDidUnload{}

    但您可以在此模式示例中使用强制内存解锁:

    在你的.h 中有一个IBOutlet 像这样:

    @property (strong, nonatomic) IBOutlet UISlider *progressSlider;
    

    比在您的.m 文件中您可以使用:

    - (void)viewDidUnload {
        [super viewDidUnload];
        [self setProgressSlider:nil];
    }
    

    希望对你有所帮助

    【讨论】:

    • 是的,我确实喜欢这个。但是过渡时内存不会减少。我怎样才能减少内存
    • 尝试使用 - (void)viewDidDisappear:(BOOL)animated; 来实现我的代码;
    • 感谢您的建议。我的问题是如何在 - (void)viewDidDisappear:(BOOL)animated; 中释放当前视图控制器;
    • 还有其他方法,但我不喜欢,我解释一下:您可以删除单个文件 .m 的 ARC 并使用 Release 和 Dealloc:在此处查看我的帖子:stackoverflow.com/questions/15702604/…跨度>
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多