14

我以为我从这个问题中清楚地理解了它-> IBOutlets 在ARC下应该强还是弱?但我最近有一个讨论让我完全困惑。有人可以确认以下内容是否正确吗?(如果这是重复的,我并不是要打破任何规则..只需要澄清一下,因为我可以比文字更好地理解图表..)

在此处输入图像描述

在 ARC (MacOSx) 下

  1. view1 = 强
  2. MainView = 弱(在 WindowControllerA 中)
  3. MainView = 强(在 ViewControllerB 中)
  4. view2 = 强
  5. view3 = 弱(在 ViewcontrollerB 中)
  6. view3 = 强(在 ViewControllerC 中)

如果这是正确的,那么有人可以确认请..

在上图中,我们在屏幕上有一个 windowControllerA 。在 windowControllerA 的视图中,有 2 个 NSView。view1 属于 windowController,而 mainView 属于实例化的 viewController,ViewControllerB 的视图。

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

ViewController C 拥有一个视图。

4

3 回答 3

19

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

在 ARC 之前的日子里,有些人乐于依靠视图层次来为他们保留视图,因此将他们的出口属性设置为assign. 其他人不喜欢视图层次结构中的一个小问题可能会给它们留下一些悬空指针,因此将它们的属性设置为retain. nilARC 为我们提供了归零弱引用,因此如果它们指向的对象被释放,您的 outlet 将被设置为,这使得对 outlet 使用弱引用似乎更安全。另一方面,如果您想维护对视图的引用,即使包含 is 的视图层次结构已被释放,您应该将该引用设置为strong.

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

于 2013-09-23T21:49:45.953 回答
2

只要我理解这个“所有顶级对象都应该是强的。子视图应该是弱的”。所以在那种情况下view2 也应该很弱

  • view1 = 强
  • MainView = 弱(在 WindowControllerA 中)
  • MainView = 强(在 ViewControllerB 中)
  • view2 = weak(因为 mainview 已经持有它)
  • view3 = 弱(在 ViewcontrollerB 中)
  • view3 = 强(在 ViewControllerC 中)
于 2013-11-08T13:20:33.900 回答
0

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

子视图归其父视图所有,因此只要您不以编程方式拆除视图层次结构(并在其中负责视图所有权),您就不必担心太多。

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

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

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

如果是这样 --- 如果您对 .xib 对象的 IBOutlet 引用很弱,或者是强引用,或者根本没有引用,有什么区别 --- 您仍然是该对象的“文件所有者”,

一些更好的解释会做。

于 2014-08-09T18:57:40.847 回答