2011-08-05 47 views
0

與由委託和數據源的連接,我有以下控制器:NSTableView的崩潰

#import <Foundation/Foundation.h> 

@interface KextTable : NSObject <NSTableViewDataSource> { 
@private 
    NSArray *klist; 
} 
- (int)numberOfRowsInTableView:(NSTableView *)tableView; 
- (id)tableView:(NSTableView *)tableView 
objectValueForTableColumn:(NSTableColumn *)tableColumn 
      row:(int)row; 
@end 

#import "KextTable.h" 


@implementation KextTable 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
}  
    return self; 
} 

-(void) awakeFromNib 
{ 
    klist = [[NSArray alloc] init]; 

    klist = [NSArray arrayWithObjects: @"1", @"2", 
      @"3", @"4", nil]; // debugging values only 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

- (int)numberOfRowsInTableView:(NSTableView *)tableView 
{ 
    return [klist count]; 
} 

- (id)tableView:(NSTableView *)tableView 
objectValueForTableColumn:(NSTableColumn *)tableColumn 
      row:(int)row 
{ 
    return [klist objectAtIndex:row]; 
} 

@end 

而這種代碼在我的主界面控制與EXC_BAD_ACCESS崩潰,其中的觀點是切換到包含表格視圖的選項卡。哪裏不對?

(我知道的連接是正確的,如果我在objectValueForTableColumn創建數組它的工作原理)

+0

你的數據源方法應該返回'NSInteger',而不是'int'。 –

回答

2

這是因爲要創建的klist的(調試之一)使用自動釋放它的構造函數。所以,你應該加入:

klist = [[NSArray arrayWithObjects: @"1", @"2", @"3", @"4", nil] retain]; 

一定要注意,你所做的事有內存泄漏(您創建一個NSArray,然後重新分配變量別的東西......)

+2

並且不要忘記在'dealloc'中釋放數組。或者,將項目切換到使用ARC;那麼你將不需要(或能夠使用)'retain',並且不需要'dealloc'方法。 –