【问题标题】:When should I use Strong vs Weak for IBOutlets (further clarification)我什么时候应该对 IBOutlets 使用强 vs 弱(进一步说明)
【发布时间】:2013-09-28 22:23:32
【问题描述】:

我以为我从这个问题中清楚地理解了它 --> Should IBOutlets be strong or weak under 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的view。

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

ViewController C 拥有一个视图。

【问题讨论】:

    标签: objective-c cocoa iboutlet


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨,Caleb,所以在上图中.. 哪个应该是强/弱?我真的不想“不担心”,因为我想理解它。我是否只是让顶级对象 strong 并让其他所有东西 weak
    • @Jai 我说你“不用担心”,因为 UIViewController 的 view 属性已经很强大了。换句话说,你不需要做任何特别的事情来实现它。正如我上面所说,子视图的出口可能很弱除非即使视图图的其余部分被释放,你也想挂在视图上。我不太了解你的图表,所以不会对此发表评论。
    • @Caleb 因此,如果 IBOutlet 设置为 strong,它将保留在内存中。但是我们如何访问这个内存呢?
    【解决方案2】:

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

    • view1 = 强
    • MainView = 弱(在 WindowControllerA 中)
    • MainView = 强(在 ViewControllerB 中)
    • view2 = 弱(因为主视图已经持有它)
    • view3 = 弱(在 ViewcontrollerB 中)
    • view3 = 强(在 ViewControllerC 中)

    【讨论】:

    • 谢谢。 +1。根据我上面提出的问题,您的回答是正确的。但我决定更改设置并选择下面的答案,因为它更具描述性。
    【解决方案3】:

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

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

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

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

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

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

    一些更好的解释会做。

    【讨论】:

    • 阵列控制器等应该很强大。关键是XIB中元素的出口需要很强大,除非它们是视图层次结构的一部分并且由它们的超级视图/父窗口持有,但碰巧你链接到的大多数元素都是,所以结果只有来自 XIB 的不相关对象(如其他控制器)需要很强大。
    • 当你加载一个NIB时,图表上的所有元素都会被加载到内存中,但如果它们没有被任何东西保留,它们将立即被释放。视图/窗口中的控件由其父级保留,但必须使用强大的 IBOutlet 保留独立元素。
    • 谢谢,这很有意义。尽管如此,在过去,当我们没有“属性”并且每个人都将其控制器的普通成员用作 IBOutlets 时,我不记得曾经在我的“awakeFromNib”等中保留任何拥有顶级 NIB 对象的 IBOutlet 成员那么呢?
    猜你喜欢
    • 2011-12-31
    • 2021-12-19
    • 2019-11-04
    • 2015-03-09
    • 2019-08-14
    • 2014-08-06
    • 2013-11-16
    相关资源
    最近更新 更多