什么时候我应该使用强弱对弱IBOutlets(进一步澄清)

时间:2013-09-23 21:22:44

标签: objective-c cocoa iboutlet

我以为我从这个问题中清楚地理解了这一点 - > Should IBOutlets be strong or weak under ARC?但我最近进行了一次讨论,让我完全糊涂了。有人可以确认以下是否正确? (如果这是一个副本,我并不打算违反任何规则..只需要澄清,因为我可以比文字更好地理解图表。)

enter image description here

在ARC(MacOSx)下

  1. view1 = strong
  2. MainView = weak(在WindowControllerA中)
  3. MainView = strong(在ViewControllerB中)
  4. view2 = strong
  5. view3 = weak(在ViewcontrollerB中)
  6. view3 = strong(在ViewControllerC中)
  7. 如果这是正确的,那么有人可以确认..

    在上图中,我们在屏幕上有一个的windowControllerA 。在windowControllerA的视图中,有2个NSView。 view1属于windowController,但是mainView属于instiociated viewController,ViewControllerB的视图。

    ViewControllerB在其mainView中还包含2个视图。 View2由viewControllerB拥有,而view3属于另一个实例viewController,ViewControllerC。

    ViewController C拥有一个拥有的视图。

3 个答案:

答案 0 :(得分:19)

子视图的大多数出口不需要是强引用,因为毕竟它们是作为视图层次结构的一部分加载的子视图。只要顶层视图存在,并且只要您不从父项中删除子视图,视图层次结构中的子视图将由其父项保留在顶级视图的生命周期中。

在ARC之前的日子里,有些人乐于依赖视图层次结构来保留他们的观点,因此将他们的出口属性设置为assign。其他人不喜欢视图层次结构中的打嗝可能会让他们留下一些悬空指针的想法,因此将其属性设置为retain。 ARC给我们归零弱引用,如果它们指向的对象被释放,你的出口将被设置为nil,这使得使用弱引用的出口似乎更安全。另一方面,如果要保留对视图的引用,即使已取消分配包含的视图层次结构,也应将该引用设置为strong

由于您的视图控制器负责其管理的视图层次结构(即“拥有”),因此它应该具有对顶层视图的强引用。您不必过于担心这一点,因为任何UIViewController派生的视图控制器的view属性都设置为retain(即strong)。

答案 1 :(得分:2)

只要我明白这一点"所有顶级对象都应该很强大。子视图应该很弱"。因此,在这种情况下, view2也应该是弱的

  • view1 = strong
  • MainView = weak(在WindowControllerA中)
  • MainView = strong(在ViewControllerB中)
  • view2 = weak(因为mainview已经拥有它)
  • view3 = weak(在ViewcontrollerB中)
  • view3 = strong(在ViewControllerC中)

答案 2 :(得分:0)

关于文件所有者的IBOutlets中.xib对象的弱与强引用的讨论很多---似乎每个人都只关注视图和子视图。

子视图由他们的超级视图拥有,因此只要您不以编程方式拆除视图层次结构(并在其中负责查看所有权),您就不必担心太多。

但是 - 你经常在.xibs中创建的所有其他对象怎么样呢,比如NSArrayControllers和那些非视图的根级UI项目,比如Windows,Panels,Alerts等等 - 应该是引用强吗?弱?

我真的需要一些关于xib如何工作的低级别解释。当一个对象是"文件的所有者"并加载其nib文件,什么加载和初始化?只是你有IBOutlets的对象?每个顶级对象?

谁拥有所有这些根级对象?在加载笔尖的所有控制器之后(通常是"文件的所有者"拥有.xib ---但这是否意味着它(自动)拥有笔尖中的根级对象?

如果是这样的话 - 如果您对.xib对象的IBOutlet引用较弱,或者强大,或者根本没有引用,则有什么区别----您仍然是"文件' s所有者"对于那个对象,

可以做一些更好的解释。