2012-08-01 123 views
1

根據蘋果的documentation,初始化NSWindowController子類的推薦方法是通過調用init()和NOT initWithWindowNibName()。該文件接着說,既然一個NSWindowController可能只打算用它是專爲筆尖工作,然後讓子類調用超initWithWindowNibName,如果任何initWithWindowNib的......方法是子類都應該記錄一個錯誤調用。初始化NSWindowController子類

所以這是我寫的:

- (id) init 
{ 
    NSLog(@"init()"); 
    return [super initWithWindowNibName:@"MyDocument"]; 
} 

- (id) initWithWindowNibName:(NSString *)windowNibName 
{ 
    NSLog(@"error...use init() instead"); 
    return nil; 
} 

- (id) initWithWindowNibName:(NSString *)windowNibName owner:(id)owner 
{ 
    NSLog(@"error...use init() instead"); 
    return nil; 
} 

- (id) initWithWindowNibPath:(NSString *)windowNibPath owner:(id)owner 
{ 
    NSLog(@"error...use init() instead"); 
    return nil; 
} 

當它運行時,我看到的輸出:

init() 
error...use init() instead 

所以......嗯?這是怎麼回事?

有一個stackoverflow question有關init()被調用兩次,分辨率爲一個實例正在通過代碼來實現,並通過筆尖等。我的筆尖根本沒有控制器對象。

回答

2

的問題是,[super initWithWindowNibName:@"MyDocument"]僅僅是一個方便的方法。它所做的只是撥打[self initWithWindowNibName:@"MyDocument" owner:self]。這當然會引發錯誤信息。您可以通過將您的init方法改爲:

- (id) init 
{ 
    NSLog(@"init()"); 
    return [super initWithWindowNibName:@"MyDocument" owner:self]; 
}