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 -autorelease
d 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
.
精彩评论