我有一个地图应用程序,它使用外围幻灯片放入/滑出右侧视图控制器,非常类似于下面显示的Google Maps应用程序(source):
在我的应用中,此幻灯片视图具有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
替换而被解除豁免吗?
答案 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
不会。