为什么我的NSTableView数据源方法出现EXE_BAD_ACCESS错误?

时间:2010-08-30 20:04:15

标签: objective-c cocoa nstableview

我决定最近回到Cocoa / Objective-C编程,我当前的项目需要一个NSTableView。

我以为我把这个过程归结为科学但看起来我错了。我在实际返回数据的datasource方法中收到EXE_BAD_ACCESS错误。

当我运行应用程序时,所有结果都显示在NSTableView上,但不久之后,就会出现EXE_BAD_ACCESS。偶尔,看似随机,EXE_BAD_ACCESS错误不会被抛出,而是我会在控制台中得到各种错误,如下所示:

-[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x10011b780

之后,界面变得几乎没有反应。

从各种调试消息中我能够预测到发生了错误,因为正在使用大于数据NSArray计数的行整数调用该方法。我的Mac搞砸了,还是我做错了什么?

以下是我的代码:

头文件(TableViewController.h)

#import <Cocoa/Cocoa.h>


@interface TableViewController : NSObject {
    IBOutlet NSTableView *tableView;

    NSArray *componentArray;
}

@end

主文件(TableViewController.m)

#import "TableViewController.h"


@implementation TableViewController

- (void) awakeFromNib {
    NSString *components = @"Test:Test2:Test3";
    componentArray = [components componentsSeparatedByString:@":"];

    [tableView setDataSource:self];
    [tableView reloadData];
}

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

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row {
    // EXE_BAD_ACCESS is occuring here
    return [componentArray objectAtIndex:row];
}

@end

2 个答案:

答案 0 :(得分:3)

componentArray = [components componentsSeparatedByString:@":"];

-componentsSeparatedByString:方法返回-autorelease d数组。因此,到需要时,componentArray可能不再有效。

您需要明确-retain它。

componentArray = [[components componentsSeparatedByString:@":"] retain];

(当然,请确保-release中的-dealloc数组。或者只是打开垃圾收集并忘记内存管理。)

答案 1 :(得分:2)

填好后再保留componentArray,然后在dealloc中执行必要的发布。