【问题标题】:Why does Apple use assign rather than weak to store a delegate?为什么Apple使用assign而不是weak来存储委托?
【发布时间】:2013-12-06 08:28:25
【问题描述】:

一些 Cocoa 和 Cocoa Touch 类将它们的委托属性声明为 assign 而不是 weak,这会强制类的用户将 nil 排除在 dealloc 中的属性之外

-(void)dealloc
{
    self.imageScrollView.delegate = nil;
    self.tableView.delegate = nil;
    self.tableView.dataSource = nil;
}

这很麻烦。

为什么苹果会这样做?

【问题讨论】:

  • 一个引用是对一个对象的引用,它不会阻止它被释放。

标签: cocoa-touch cocoa delegates automatic-ref-counting declared-property


【解决方案1】:

原因是不是所有的系统类都用 ARC 编译过。

如果你需要管理资源,你可以实现一个 dealloc 方法 除了释放实例变量。你不必(确实 你不能)释放实例变量,但你可能需要调用 [systemClassInstance setDelegate:nil] 关于系统类和其他代码 不是使用 ARC 编译的。

在 developer.apple.com 上查看此页面:Transitioning to ARC Release Notes

【讨论】:

  • IOS 7 之后没有变化?
  • 或者至少 Apple 可以说 assign 表示弱而 unsafeassign 表示旧的分配。
  • 在 iOS 7 中仍然是一样的。你说得对,因为我们在程序中使用它们,所以它不是最直观或最方便的方式来定义代表。
  • 所以我们必须将这些委托设置为 nil
  • 没错。在委托对象的 dealloc 方法中将它们设置为 nil 以避免潜在的崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
相关资源
最近更新 更多