Cocoa 未调用initWithFrame,但已调用awakeFromNib

Cocoa 未调用initWithFrame,但已调用awakeFromNib,cocoa,Cocoa,我试图将NSOutlineView子类化。这是我的密码: 大纲视图主题h: #import <Cocoa/Cocoa.h> @interface OutlineViewSubclass : NSOutlineView { } @end 调试输出为: debug B 为什么没有调用(id)initWithFrame:(NSRect)frame?Cocoa控件实现从nib取消归档的NSCoding协议。当使用Interface Builder配置的序列化属性加载控件时,init

我试图将NSOutlineView子类化。这是我的密码:

大纲视图主题h:

#import <Cocoa/Cocoa.h>

@interface OutlineViewSubclass : NSOutlineView {

}

@end
调试输出为:

debug B

为什么没有调用
(id)initWithFrame:(NSRect)frame

Cocoa控件实现从nib取消归档的NSCoding协议。当使用Interface Builder配置的序列化属性加载控件时,initWithCoder:方法负责设置控件,而不是使用initWithFrame:初始化对象,然后设置属性。这与使用NSCoding序列化任何对象的方式基本相同


如果将自定义NSView子类粘贴到未实现NSCoding的nib中,则会有一点不同,在这种情况下,将调用initWithFrame:。在这两种情况下,awakeFromNib都将在加载对象后被调用,通常是在子类中执行额外初始化的好地方。

苹果对此的官方答案是

在Interface Builder中创建的视图实例在加载其nib文件时不调用initWithFrame:,这通常会导致混淆。请记住,Interface Builder在保存nib文件时会归档对象,因此视图实例将已经创建,并且initWithFrame:将已经被调用

awakeFromNib方法提供了在加载nib文件后创建视图时初始化视图的机会。加载包含视图对象的nib文件时,当所有对象都未归档时,每个视图实例都会收到awakeFromNib消息。这使对象有机会初始化未在Interface Builder中与对象一起存档的任何属性


(我指的是第二段)为什么他在未实现NSCoder的情况下对“NSOutlineView”进行了子许可,却没有在initWithFrame:(“调试A”)上得到回调?链接是有帮助的;有关更深入的讨论,请参见本节
debug B