【发布时间】:2013-06-06 08:25:30
【问题描述】:
我有一个使用外围滑入/滑出右手视图控制器的地图应用程序,很像下面显示的 Google 地图应用程序 (source):
在我的应用程序中,这个滑出视图有一个 weak delegate 属性,我将地图视图控制器设置为委托(例如,mapOptionsViewController.delegate = self 来自内部 myMapViewController)。不过,我也希望使用右侧的幻灯片查看其他类型的信息。例如。显示用户在地图上选择的餐厅菜单,menuViewController。
我的问题是,如果我将mapOptionsViewController 换成menuViewController,我还需要手动将nil 从mapOptionsViewController.delegate 换出myMapViewController 吗?我担心的是即使mapOptionsViewController在我切换到menuViewController时被dealloc'd/disposed,因为myMapViewController仍然指向旧的mapOptionsViewController.delegate,mapOptionsViewController.delegate的内存不会被释放堆。
所以基本上,如果你有一个对象视图控制器foo(我的地图),它是另一个视图控制器bar(地图选项)的代表,例如bar.delegate = foo,然后你切换出bar对于baz(餐厅菜单),我是否需要从foo 设置bar.delegate = nil。或者,当视图控制器 delegate 包含在被释放为 baz 时,bar nil out delegate 会被释放吗?
【问题讨论】:
-
不要考虑分配和释放。想想所有权:释放和保留。强属性会这样做,弱属性不会。
-
如果我错了,请纠正我,但在这种情况下,
strong/weak的区别并不是无关紧要的,因为bar.delegate = foo创建了一个从foo到@987654353 的强指针@ (我假设?)。尽管bar中的delegate属性被声明为weak,但这并不能改变foo(地图)在我们完成bar之后仍然强烈指向它的事实,并且所以bar.delegate还在记忆中吗? -
"
bar.delegate = foo创建一个从foo到bar.delegate的强指针" - 为什么会这样?bar.delegate是weak。 -
也许是我对弱指针的理解有缺陷。我对弱指针的定义一直是“只要其他人强烈指向它,就保持它”。如果从
foo内部调用的bar.delegate = self不是强指向delegate属性的示例,该属性已在bar的类中声明为weak,您能否提供一个示例说明它是什么?跨度> -
好吧,也许这在语义上是等价的,但你把它复杂化了。
weak引用不进行引用计数。这暗示如果你想保持对象存活,就需要一个强引用。但实际上这些属性不需要相互了解(作为一个实现细节,它们可能会这样做,因为当它们的值被释放时它们会自动被清空,但这不是要考虑/依赖的)。如果你有一个指向对象的强指针和弱指针,没有别的,那么将弱指针归零没有效果,但将强指针归零
标签: objective-c automatic-ref-counting