当在ARC下取消分配视图控制器时,如果另一个对象具有强引用,它的属性是否也会被释放?

时间:2013-06-06 08:25:31

标签: objective-c automatic-ref-counting

我有一个地图应用程序,它使用外围幻灯片放入/滑出右侧视图控制器,非常类似于下面显示的G​​oogle Maps应用程序(source):

enter image description here

在我的应用中,此幻灯片视图具有weak delegate属性,我将地图视图控制器设置为委托(例如mapOptionsViewController.delegate = self内的myMapViewController )。我也希望使用右侧幻灯片查看其他类型的信息。例如。显示用户在地图上选择的餐馆菜单menuViewController

我的问题是,如果我为mapOptionsViewController换出menuViewController,是否还需要nil mapOptionsViewController.delegate myMapViewController手动mapOptionsViewController?我担心的是,当我切换到menuViewController时,即使myMapViewController被解除分配/处置,因为mapOptionsViewController.delegate仍然指向旧mapOptionsViewController.delegate,{{1不会从堆中释放内存。

所以基本上,如果你有一个对象视图控制器foo(我的地图),它是另一个视图控制器bar(地图选项)的委托,那么bar.delegate = foo,然后您为bar(餐厅菜单)切换baz,是否需要从bar.delegate = nil设置foo。或者,bar在包含视图控制器delegate的情况下delegate会因为被baz替换而被解除豁免吗?

2 个答案:

答案 0 :(得分:0)

  

所以基本上,如果你有一个对象视图控制器foo(我的地图),它是另一个视图控制器栏(地图选项)的委托,比如bar.delegate = foo,然后你为baz(餐馆)换出吧menu),我需要从foo设置bar.delegate = nil。或者,当视图控制器委托包含在由于被baz替换为dealloc'd时,是否会禁止委托?

所以,让我们看看我是否理解你在做什么。

您有bar,对foo的引用较弱,因此bar.delegate = foo。您还必须拥有其他内容(我称之为qux)并强烈引用相同的foo,否则您的foo就会消失。假设相关属性为qux.menuThingy = foo

然后你做qux.menuThingy = baz。您的bar会怎样?

如果qux是唯一强烈引用foo的内容,则现在没有对foo的强引用,因此foo已取消分配。因为您使用了弱引用,所以bar.delegate已自动设置为nil。你不必自己动手。

如果有另一个对象强烈引用foo,那么foo仍然存在并且尚未解除分配。

答案 1 :(得分:0)

总之,没有。只要一个对象仍然具有强引用,并且没有释放具有字符串引用的最后一个对象,它就不会被释放。或者,你有一个错误。

此外,当引用它的对象被释放时,weak引用将自动归零。但是assign不会。