代码之家  ›  专栏  ›  技术社区  ›  Manuel

弧中的系统对象代理是否需要设置为零?

  •  3
  • Manuel  · 技术社区  · 7 年前

    应用程序有时会因错误而崩溃 objc_object::release() .

    苹果开发者技术支持提到:

    请记住,您应该始终执行类似于_tableView的操作。代表 =零;在您的-dealloc方法中,即使您使用的是ARC。出于兼容性原因,系统对象使用 unsafe_unretained 替换 weak .

    class MyViewController: UIViewController {
       deinit {
          tableView.delegate = nil
          tableView.dataSource = nil
       }
    }
    

    我一直以为 UITableView 类似的标准对象正在使用 虚弱的


    更新:

    技术支持的示例似乎过时了,因为 UITableView 虚弱的 代表但是,并非所有代表都已更新,例如 AVAudioPlayer.delegate 仍然是 unowned(unsafe) . 似乎苹果正在逐渐更新代表 .

    因此,可以通过检查Xcode中的委托声明来确定是否手动将委托设置为nil。如果是的话 ,不用麻烦了。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jonah    7 年前

    是的,您应该将这些代理设置为 nil .

    unsafe_unretained 引用不会保留视图控制器,因此这里没有保留周期或内存泄漏。然而,与 weak

    我所知道的最简单的方法是在滚动仍在滚动时(例如,从一长串项目上的有力滑动手势)关闭并释放作为滚动视图(或其子类之一,如UtableView)代理的视图控制器。然后,滚动视图将尝试调用委托方法(如 scrollViewDidScroll )在解除分配的控制器上。