NSWindow内部的物体如何坚持只有一个弱的出口?

时间:2013-11-17 00:50:46

标签: objective-c cocoa reference weak-references iboutlet

我正在阅读Apple关于获取基础编程技能的文档。我已经读过,对于不属于顶级对象的出口,如果是对于像“窗口,视图,视图控制器或其他控制器”这样的顶级对象,引用应该是弱的。在混音器教程中,我看到应用代表有:

@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *textField;
@property (weak) IBOutlet NSSlider *slider;

它告诉我某些类NSWindow使用assign代替。由于删除了没有强引用的对象,我想知道窗口中的对象 - 滑块,文本字段等是如何持久的,因为除了为插座和方法拖动一些东西之外我不为它们编写任何代码对于包含弱引用的app委托 - 也许它在xib文件中的所有内容并且我还没有学到足够的东西才能看到问题中的任何缺陷,但我认为界面的每个元素都需要持久化。

1 个答案:

答案 0 :(得分:1)

当您实例化在界面构建器中构建的视图时,Cocoa会为您创建整个视图层次结构:顶部窗口包含滑块,文本字段,按钮等;子视图包含其他子视图,而这些子视图又可以包含自己的子视图。层次结构中的每个级别都强烈引用低于它的级别,一直到最低级别的子级。一旦你有了一个你的视图实例,你就可以拥有对前一个视图的强引用:所有其他视图将继续被其父视图引用,防止它们过早被破坏。

请注意,只有以self.view为根的层次结构内的视图才会被引用。如果您有其他未从self.view引用的IB元素,则它们必须是强引用。否则,一旦实例化它们的方法存在,就会释放来自XIB的“膨胀”视图,因为没有强有力的参考来保持这些视图存活。

通常会对视图层次结构中除最顶层元素之外的元素进行weak引用,以避免在视图层次结构中出现意外的自引用循环。