说有一个对象A
A强烈提及B
B强烈提及C
现在,说删除了对A的最后一个引用。假设A在堆栈中并且函数结束。
所以A走了。
在它濒临死亡时,A会通知B它已经消失了吗? B和C也会消失吗?
-(void) foo
{
A * a= [[A alloc]init];
A.b = [[B alloc]init];
A.b.c = [[C alloc]init];
//end of function what happen here? Will a, A.b and A.b.c gone too? How exactly that work?
}
答案 0 :(得分:3)
A在堆中(指针在堆栈中)。 而且......是的......如果对某个对象没有更强的引用,它会立即被释放。
ARC不是垃圾收集器。它只是一个编译时功能。它会自动向对象添加retain,release和autorelease语句。 所以..在ARC模式下,你的dealloc方法自动调用B上的释放.B的dealloc方法调用C上的释放。
BTW:您可以实现dealloc方法。你不能在其中调用发布..所以你可以关闭套接字或免费资源....
答案 1 :(得分:1)
您的课程需要在取消分配时释放他们的参考资料。
我不认为ARC在这里会改变任何东西(除了自动插入释放调用)。
答案 2 :(得分:1)
使用ARC并将这些引用标记为strong,可确保编译器在dealloc方法中合成对这些对象的释放调用。
所以,是的,假设没有其他对象B和C的引用,它们作为A的垂死呼吸的一部分被释放:)