开发者

Why am I getting an EXE_BAD_ACCESS error with my NSTableView datasource methods?

I decided to get back to Cocoa/Objective-C programming recently and my current project calls for an NSTableView.

I thought I had gotten the process down to a Science but it appears I was wrong. I am getting an EXE_BAD_ACCESS error in the datasource method that actually returns the data.

When I run the application, all results show up on the NSTableView but shortly after, the EXE_BAD_ACCESS occurs. Occasionally, and seemingly randomly, the EXE_BAD_ACCESS error will not be thrown and instead I will get various errors in the console like the one below:

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

Afterwards, the interface becomes mostly unresponsive.

From various debug messages I have been able to predict that an error is occurring because the method is being called with a row integer that is greater than the data NSArray's count. Is my Mac screwing up or am I doing something wrong?

Below is my code:

Header File (TableViewController.h)

#import <Cocoa/Cocoa.h>


@interface TableViewController : NSObject {
    IBOutlet NSTableView *tableView;

    NSArray *compone开发者_Go百科ntArray;
}

@end

Main File (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


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

The -componentsSeparatedByString: method returns an -autoreleased array. Therefore, by the time it is needed, the componentArray may no longer be valid.

You need to -retain it explicitly.

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

(of course, make sure to -release the array in -dealloc. Or just turn on Garbage Collection and forget about memory management.)


Retain componentArray once you have it populated, then do the requisite release in dealloc.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜