当视图控制器ARC下dealloc'd,是它的性质也dealloc'd如果另一对象具

2019-10-30 09:28发布

我有一个使用中/滑动出来的右手视图控制器的外围滑动,就像下面(所示的谷歌地图应用程序的映射应用程序源 ):

在我的应用程序,这滑出视图具有weak delegate属性,我设置地图视图控制器为所述代表(例如mapOptionsViewController.delegate = self从内侧myMapViewController )。 我还希望,虽然用右手滑动并鉴于其他种类的信息。 例如显示用于使用户选择地图,关于餐馆的菜单menuViewController

我的问题是,如果我换出mapOptionsViewControllermenuViewController ,做我需要手动nilmapOptionsViewController.delegatemyMapViewController也? 我担心的是,即使mapOptionsViewController被dealloc'd /设置当我做开关的menuViewController ,因为myMapViewController仍然指向旧mapOptionsViewController.delegatemapOptionsViewController.delegate的内存不会被从堆中释放。

所以基本上,如果你有一个对象视图控制器foo (我的地图),这是另一种视图控制器的委托bar (图选项),这样bar.delegate = foo ,然后切换出barbaz (餐厅的菜单)我需要设置bar.delegate = nil ,从foo 。 或者,将bar零出delegate当视图控制器delegate包含在被dealloc'd与被替换的结果baz

Answer 1:

所以基本上,如果你有一个对象视图控制器富(我的地图),这是另一种视图控制器栏(图选项)的委托,这样bar.delegate = FOO,然后切换出巴巴兹(餐厅的菜单)我需要从富设定bar.delegate =零。 或者,当视图控制器代表包含在被dealloc'd与巴兹被替换的结果将禁止零出代表?

所以,让我们来看看,如果我理解你在做什么。

你有一个bar ,一个弱引用到foo ,所以bar.delegate = foo 。 此外,还必须有其他的东西(我称之为一个qux具有较强的参考相同) foo ,否则你的foo就已经消失了。 比方说,有关财产是qux.menuThingy = foo

那么你就qux.menuThingy = baz 。 碰巧你什么bar

如果qux是具有较强的参考唯一foo ,现在有到没有更多的强引用foo ,所以foo被释放。 因为我们使用了弱引用, bar.delegate已经自动设置成零为您服务。 你不必自己做。

然而,如果有一个强大的参考又一目的foo ,那么foo仍然存在,并没有被释放。



Answer 2:

一句话,没有。 只要对象仍然有很强的借鉴意义,而且有一个字符串引用它不释放的最后一个对象,它不释放。 或者,你有一个bug。

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



文章来源: When a view controller is dealloc'd under ARC, are it's properties also dealloc'd if another object has a strong reference?