我正在浏览由 Scott Stevenson 维护的精彩博客,我试图理解一个基本的 Objective-C 概念,即为代表分配“分配”属性与“保留”。请注意,两者在垃圾收集环境中是相同的。我最关心的是基于非 GC 的环境(例如:iPhone)。
直接来自 Scott 的博客:
“assign 关键字将生成一个 setter,它直接将值分配给实例变量,而不是复制或保留它。这最适用于 NSInteger 和 CGFloat 等原始类型,或者您不直接拥有的对象,例如委托。”
您不直接拥有委托对象是什么意思?我通常会保留我的代表,因为如果我不希望他们陷入深渊,保留会为我解决这个问题。我通常将 UITableViewController 从其各自的数据源和委托中抽象出来。我也保留了那个特定的对象。我想确保它永远不会消失,所以我的 UITableView 总是有它的委托。
有人可以进一步解释我在哪里/为什么错了,这样我就可以理解 Objective-C 2.0 编程中使用委托而不是保留的分配属性的常见范例?
谢谢!
避免保留代表的原因是您需要避免保留周期:
A 创建 B A 将自己设置为 B 的委托 - A 由其所有者释放
如果 B 保留了 A,A 将不会被释放,因为 B 拥有 A,因此 A 的 dealloc 将永远不会被调用,从而导致 A 和 B 都泄漏。
您不应该担心 A 会消失,因为它拥有 B 并因此在 dealloc 中摆脱了它。