我决定最近回到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
答案 0 :(得分:3)
componentArray = [components componentsSeparatedByString:@":"];
-componentsSeparatedByString:
方法返回-autorelease
d数组。因此,到需要时,componentArray
可能不再有效。
您需要明确-retain
它。
componentArray = [[components componentsSeparatedByString:@":"] retain];
(当然,请确保-release
中的-dealloc
数组。或者只是打开垃圾收集并忘记内存管理。)
答案 1 :(得分:2)
填好后再保留componentArray
,然后在dealloc
中执行必要的发布。