3

我试图使用 NSarray 创建一个带有 NSTableView 的简单菜单。当我将数据源设置为我创建的类时,我得到 EXC_BAD_ACCESS 错误。奇怪的是,它在 macruby 中工作?实现文件:

@implementation TableArray

- (id) init
{
    self = [super init];
    if(self) {
        arr = [NSArray arrayWithObjects:@"hey", @"what", @"there", nil];
    }
    return self;
}

- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView 
{
    return [arr count];
}

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn      *)aTableColumn row:(NSInteger)rowIndex
{
    return [arr objectAtIndex:rowIndex];
}

@end

标题:

@interface TableArray: NSObject <NSTableViewDataSource> {
   NSArray *arr;    
} 

- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView;
- (id) tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn  *)aTableColumn row:(NSInteger)rowIndex;
@end

在应用程序委托中:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    TableArray *arr = [[TableArray alloc] init];
    [tv setDataSource:arr];
    [tv reloadData];
}

和委托标头:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {
   IBOutlet NSTableView *tv;
}

@property (assign) IBOutlet NSWindow *window;

@end
4

2 回答 2

1

我打赌你启用了 ARC(可能是 GC)。NSTableView 维护对其数据源的弱引用,而您没有维护对其数据源的强引用,因此 ARC 在您完成之前释放您的数据源。

请注意,像这样浮动的数据源非常罕见。它几乎可以肯定是应用程序控制层的一部分,因为数据源是表和底层数据存储之间的管道。

它可能在 MacRuby 下工作,因为代码略有不同或因为实现细节。

于 2013-01-14T01:54:32.670 回答
0

知道你在哪里初始化 *tv 会很有用。我假设您已将其放置在一些在应用程序启动时加载的 NIB 文件中。
然后,您应该放入IBOutlet NSTableView *tv;一个 ViewController,最好是一个子类UITableViewController。tableView 参考/插座属于那里。此外,将 viewController 本身用作 dataSource 并在 Interface Builder 中建立连接会更容易。

于 2013-01-14T00:50:09.477 回答