首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios对强/弱引用感到困惑

ios对强/弱引用感到困惑
EN

Stack Overflow用户
提问于 2012-07-13 02:29:56
回答 3查看 8.3K关注 0票数 2

我已经看过强/弱引用的问题,并理解了使用弱(父子关系)的原因。然而,我对创建父子关系的特定场景感到困惑。

例如,向UIView object..an添加子视图是否是创建父/子关系的示例?是什么?

到目前为止,我在我的项目中做了所有的事情,我没有使用过弱,但我不确定我是否会遇到内存管理问题(或者如何检查如果我会)。

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

谢谢!

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-13 03:03:32

你的理解是倒退的。弱引用更常用于实现子到父关系。对于亲子关系来说,它们很少是有意义的。通常情况下,父母拥有孩子;这意味着强大。

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

最常见的情况是委托。委派几乎总是拥有它被委派的东西。因此,委托对象应该具有对委托的弱引用。作为Objective-C中的约定,一个名为delegate的属性应该是弱的。(如果这感觉有点倒退,请考虑一下您在实践中如何使用UITableViewUITableViewDelegate,以及您希望考虑哪一个是“所有者”。)

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

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

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

票数 15
EN

Stack Overflow用户

发布于 2012-07-13 03:11:56

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-07-13 03:02:36

当您向视图添加子视图时,父视图将在幕后保留其子视图。是的,这是父子关系。如果您正在创建自己的UIView子类,您将执行相同的操作。

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

Strong是默认的,当你使用委托模式时,你会倾向于使用弱。

也许你应该发布更多关于你收到的内存警告问题的具体信息,因为这个问题是关于内存语义的相当一般的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11458286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档