在iOS中,强引用何时被释放?

5
我有一个关于iOS中ARC的问题(很抱歉我问了这么多这种类型的问题,但是关于内存管理我真的非常困惑)。需要注意的是,我从未使用过旧的内存维护系统(如retain、release、assign等),因此我不太清楚这些术语的含义。
现在我对如何确保强引用属性得到正确释放感到困惑。例如,假设我正在制作一个学校应用程序,我的School对象包含对5个不同Child对象的强引用属性引用(不在数组中)。每个Child对象都有一个指向Book对象的强指针(属性)。
如果我从学校中删除其中一个Child对象(通过将其属性设置为nil或通过更改我的属性以指向新对象),那么它的Book是否会被正确释放?我需要做什么来确保这一点?我需要在dealloc方法中写self.myBook = nil吗?如果Child是一个视图控制器,我需要在viewDidUnload方法中写self.myBook = nil吗?
我只针对iOS 5及更高版本进行开发,因此旧的内存管理方式对我并不重要。

我建议你阅读这个链接:http://clang.llvm.org/docs/AutomaticReferenceCounting.html - Richard J. Ross III
1个回答

6
如果我从学校中删除一个Child对象(例如通过将其property设置为nil或者通过将我的property指向一个新的对象),那么它的Book对象会被正确释放吗?
是的,只要没有其他对它的强引用。
我需要做些什么来确保这一点?
没有特别要做的事情:当你将对该对象的引用设置为nil时,ARC会减少对象的引用计数,看到该对象不再被引用,然后开始删除它。它足够聪明,可以递归处理从即将被删除的对象引用的项,因此您不会泄露任何内存。
你唯一需要担心的是循环引用:如果你的Book对象有一个对Child对象的强引用,要么将该引用设置为weak,要么在将Book对象的引用设置为nil时同时清除它(第二个选项容易出错,因此不建议使用)。

那么你会说,大部分情况下,只有在使用weak properties作为出口并避免循环依赖时才需要使用它们吗? - Nosrettap
如果存在引用循环,他无法在“dealloc”中清除它,因为“dealloc”永远不会被调用!(除非它是拥有循环成员的方法的“dealloc”) - Nicolas Miari
@ranReloaded 你是完全正确的,我已经更正了最后一段。 - Sergey Kalinichenko
1
无论如何,依赖某些“接近结束”的机会来打破循环可能是不明智的,容易失败。最好的方法是一开始就不要创建循环! - Nicolas Miari
我明白一旦指针指向nil,它很快就会被释放,但是在ARC中何时设置为nil - mfaani
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接