2

我查看了有关强/弱引用的问题,并了解使用弱(父子关系)的原因。但是,我对创建父子关系的特定场景感到困惑。

例如,是否将子视图添加到 UIView 对象..创建父/子关系的示例?什么是?

到目前为止,我在我的项目中所做的一切都是使用强的,我没有在任何地方使用弱,但我不确定我是否会遇到内存管理问题(或者如何检查我是否会遇到)。

谁能提供创建父子关系的具体情况或示例?

谢谢!

编辑:事实上,我在一个显示大量数据(地图视图、图像数量、文本、按钮)的 ViewController 中遇到了一些“收到内存警告”问题。Everything 属性有一个强指针。我需要解决此 ViewController 的内存管理问题

4

3 回答 3

15

你的理解是倒退的。弱引用更常用于实现子父关系。他们很少对父母与孩子的关系有意义。一般来说,父母拥有孩子;这意味着强大。

绝大多数时候你想要一个强有力的参考。这就是为什么它是默认值。没有强引用的最常见原因是它是否会导致保留循环。例如,如果 A 对 B 有一个强引用,那么如果 B 对 A 有一个强引用,你就会有一个循环,并且两个对象都不会被释放。因此,您选择其中一个对象作为所有者,并且它具有强引用。另一个对象具有弱引用。

最常见的情况是委托。代表几乎总是拥有它所代表的东西。所以委托对象应该对委托有一个弱引用。作为 Objective-C 中的约定,一个名为的属性delegate应该是弱的。(如果这感觉倒退了,想想你是如何使用UITableViewUITableViewDelegate实践的,以及你想将哪一个视为“所有者”。)

弱委托指针并不是一成不变的规则。也有例外,例如NSURLConnection。如果委托对象的生命周期比委托短,那么它可以(并且通常更可取)保持强引用。

“收到内存警告”不一定与内存管理有关。这只是意味着你使用了太多的内存。如果您有保留循环,那么您可能会泄漏内存,这将导致此警告。但这也可能是因为您只是使用了太多内存。Instruments 中的“分配”工具是调查此问题的最佳方式。

虽然“强”和“弱”的实现是最近对 Objective-C 的补充,但它们只是形式化并为多年来正确编写的代码通过手动保留所做的工作提供更好的语言支持。今天的所有权模式与 ARC 之前的所有权模式相同。

于 2012-07-12T19:03:31.500 回答
3

有些人整理了一个非常有用的图表来解释何时在“一起编码” Piazza 类中使用弱引用。它有一些很棒的图表来解释带有强/弱指针的基本内存管理。

http://piazza-uploads.s3-website-us-east-1.amazonaws.com/attach/h3ex5vh7htrh9/h4777mrpwp17bg/h4777tczi147de/Views,%20Outlets,%20Weak%20References.pdf

于 2012-07-12T19:11:55.770 回答
2

当您将子视图添加到视图时,父视图将保留它的子视图。是的,这是父子关系。如果您正在创建自己的 UIView 子类,您也会这样做。

父母与孩子的关系很牢固,但孩子永远不应该与父母建立牢固的关系。这可能导致保留周期,其中任何一个都不能被释放,因为它们彼此之间都有很强的联系。

Strong 是默认设置,当您使用委托模式时,您将倾向于使用weak。

也许您应该发布有关收到的内存警告问题的更具体信息,因为这个问题对于内存语义非常笼统。

于 2012-07-12T19:02:35.880 回答