Почему я получаю ошибку EXE_BAD_ACCESS с моими методами источника данных NSTableView? - PullRequest
0 голосов
/ 31 августа 2010

Я решил недавно вернуться к программированию на Какао / Objective-C, и мой текущий проект требует NSTableView.

Я думал, что перешел к науке, но, похоже, я ошибался.Я получаю ошибку 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 ]

3 голосов
/ 31 августа 2010
componentArray = [components componentsSeparatedByString:@":"];

Метод -componentsSeparatedByString: возвращает массив -autorelease d.Следовательно, к тому времени, когда это необходимо, componentArray может перестать быть действительным.

Вам нужно -retain явно.

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

(конечно, обязательно -release массив в -dealloc. Или просто включите сборку мусора и забудьте об управлении памятью.)

2 голосов
/ 31 августа 2010

Сохраните componentArray после заполнения, затем выполните требуемый выпуск в dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...