你的理解是倒退的。弱引用更常用于实现子父关系。他们很少对父母与孩子的关系有意义。一般来说,父母拥有孩子;这意味着强大。
绝大多数时候你想要一个强有力的参考。这就是为什么它是默认值。没有强引用的最常见原因是它是否会导致保留循环。例如,如果 A 对 B 有一个强引用,那么如果 B 对 A 有一个强引用,你就会有一个循环,并且两个对象都不会被释放。因此,您选择其中一个对象作为所有者,并且它具有强引用。另一个对象具有弱引用。
最常见的情况是委托。代表几乎总是拥有它所代表的东西。所以委托对象应该对委托有一个弱引用。作为 Objective-C 中的约定,一个名为的属性delegate
应该是弱的。(如果这感觉倒退了,想想你是如何使用UITableView
和UITableViewDelegate
实践的,以及你想将哪一个视为“所有者”。)
弱委托指针并不是一成不变的规则。也有例外,例如NSURLConnection
。如果委托对象的生命周期比委托短,那么它可以(并且通常更可取)保持强引用。
“收到内存警告”不一定与内存管理有关。这只是意味着你使用了太多的内存。如果您有保留循环,那么您可能会泄漏内存,这将导致此警告。但这也可能是因为您只是使用了太多内存。Instruments 中的“分配”工具是调查此问题的最佳方式。
虽然“强”和“弱”的实现是最近对 Objective-C 的补充,但它们只是形式化并为多年来正确编写的代码通过手动保留所做的工作提供更好的语言支持。今天的所有权模式与 ARC 之前的所有权模式相同。