0

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

在此处输入图像描述

在我的应用程序中,这个滑出视图有一个weak delegate属性,我将地图视图控制器设置为委托(例如mapOptionsViewController.delegate = self从内部myMapViewController)。不过,我也希望在视图中使用右侧幻灯片来获取其他类型的信息。例如,显示用户在地图上选择的餐厅的菜单menuViewController

我的问题是,如果我换成mapOptionsViewControllermenuViewController我还需要手动换nilmapOptionsViewController.delegatefrommyMapViewController吗?我担心的是,即使mapOptionsViewController在我切换到时被释放/处理menuViewController,因为myMapViewController仍然指向旧的mapOptionsViewController.delegate,mapOptionsViewController.delegate的内存不会从堆中释放。

所以基本上,如果你有一个对象视图控制器foo(我的地图),它是另一个视图控制器bar(地图选项)的代表bar.delegate = foo,然后你切换到barbaz餐厅菜单),我需要bar.delegate = nilfoo. 或者,bardelegate视图控制器delegate包含在由于被替换为baz?

4

2 回答 2

0

因此,基本上,如果您有一个对象视图控制器 foo(我的地图),它是另一个视图控制器 bar(地图选项)的委托,例如 bar.delegate = foo,然后您将 bar 切换为 baz(餐厅菜单),我是否需要从 foo.delegate = nil 设置 bar.delegate = nil。或者,当视图控制器委托包含在由于被 baz 替换而被释放时,是否会禁止 nil out 委托?

所以,让我们看看我是否明白你在做什么。

你有一个bar, 对 a 的弱引用foo,所以bar.delegate = foo。你还必须有其他东西(我称它为 a qux)并强烈引用相同的东西foo,否则你foo会消失。假设相关属性是qux.menuThingy = foo

然后你做qux.menuThingy = baz。你的会发生什么bar

如果qux是唯一对 有强引用的东西foo,那么现在不再有对 的强引用foo,所以foo被解除分配。因为你使用了弱引用,所以bar.delegate已经自动为你设置为 nil。你不必自己做。

但是,如果还有另一个对象对 具有强引用foo,那么foo仍然存在并且尚未被释放。

于 2013-06-06T10:51:39.947 回答
0

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

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

于 2013-06-06T11:18:49.233 回答