【问题标题】:Where to put cleanup code in UIViewController?UIViewController 中的清理代码应该放在哪里?
【发布时间】:2010-11-22 22:21:40
【问题描述】:

我有一个 UIViewController 子类,它为 tableview 中的每个单元格异步加载一堆图像,由单独的下载类处理。我将所有这些下载请求的列表保存在一个字典中,该字典以请求图像的单元格的索引为关键字。

我的问题是,如果视图控制器从导航控制器中弹出,我应该将取消图像下载的代码放在哪里?我需要这样做,因为如果用户在下载静止图像时回击(这可能需要一段时间),那么当他们完成下载时,viewcontroller 已经被释放。

我不能将它放在 viewWillDisappear 方法中,因为如果用户单击单独的选项卡并且仅在单击后退按钮时,我不想停止下载。现在我把这段代码放在 viewcontrollers dealloc 方法中,虽然由于某种原因它看起来不正确,但它工作正常。我想过使用 viewDidUnload 方法,但似乎只有在内存不足警告时才会调用它?

有什么想法吗?

【问题讨论】:

    标签: iphone uiviewcontroller


    【解决方案1】:

    dealloc 是解决此问题的理想场所,因为视图控制器会被释放,而您有责任清理自己的东西。

    【讨论】:

    • 您好,感谢您的快速响应。这是否包括诸如通过字典枚举并为它包含的每个对象调用方法之类的事情?只是在 dealloc 中从未见过除 [someobject release] 之​​外的代码。
    • 一般来说,-dealloc 应该取消注册您之前注册的任何“类似代理”的东西。 foo.delegate = nil[[NSNotificationCenter defaultCenter] removeObserver:self] 特别常见。如果您曾经使用过 -scrollToRect:animated: 或 -zoomToRect:animated: (或其他任何名称),您可能还需要设置 scrollView.delegate = nil;令人讨厌的是,即使滚动视图不在视图层次结构中,“动画”也会继续。也许他们已经解决了这个问题......
    • @James 在 dealloc 中做任何你必须做的清理工作。这也可以是调用其他对象或保存您当前的状态。
    【解决方案2】:

    无论如何,您可能需要考虑将代码放在viewWillDisappear: 中,毕竟如果您要导航到的屏幕需要加载任何内容,那么背景图像加载会减慢它的速度...

    【讨论】:

    • viewWillDisappear 已弃用,不再调用。
    • @SylvainG。 : 你在哪里读到 viewWillDissapear 被折旧而不被调用?它几乎没有被弃用,并且在我一直在编写的 iOS 11 视图控制器中仍然被称为。我敢肯定,如果禁用此呼叫,很多应用程序都会中断。 developer.apple.com/documentation/uikit/uiviewcontroller/…
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多