ios对强/弱引用感到困惑

时间:2012-07-12 18:29:56

标签: ios xcode memory-management weak-references strong-typing

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

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

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

是否有人可以提供创建父母与子女关系的具体情况或示例?

谢谢!

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

3 个答案:

答案 0 :(得分:15)

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

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

最常见的情况是授权。代表几乎总是拥有委托给它的东西。因此委托对象应该具有对委托的弱引用。作为Objective-C中的约定,一个名为delegate的属性预计会很弱。 (如果这感觉倒退,请考虑一下如何在实践中使用UITableViewUITableViewDelegate,以及您想要考虑哪个"所有者。")

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

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

实施" strong"和"弱"最近是Objective-C的新增内容,它们只是正式化并为正确编写的代码多年来手动保留的代码提供了更好的语言支持。今天的所有权模式与ARC之前的相同。

答案 1 :(得分:3)

有些人把一个非常有用的图表放在一起,解释何时在“Coding Together”Piazza课堂上使用弱引用。它有一些很好的图表,用强/弱指针解释基本的内存管理。

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

答案 2 :(得分:2)

当您将子视图添加到视图时,父级将保留其子视图。是的,这是父母的孩子关系。如果您正在创建自己的UIView子类,那么您将采用相同的方法。

父母与子女关系密切,但孩子与父母的关系永远不应该存在。这可能导致保留周期,因为它们彼此之间有很强的连接,所以两者都不能被释放。

强是默认值,当您使用委托模式时,您将倾向于使用弱。

也许您应该发布有关您收到的内存警告问题的更具体的信息,因为这个问题在内存语义方面非常普遍。