2011-08-05 48 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'方法。 –