NStableview setDatasource EXC_BAD_ACCESS

Я пытаюсь просто создать простое меню с NSTableView, используя NSarray. Когда я устанавливаю источник данных в класс, который я создал, я получаю ошибку 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

person user1975095    schedule 13.01.2013    source источник
comment
Вы не инициализировали tv, нулевые целевые сообщения следует игнорировать.   -  person Ramy Al Zuhouri    schedule 14.01.2013
comment
tv — это IBOutlet для табличного представления, созданного в конструкторе интерфейсов. У меня также включен ARC. Сбой программы - основная проблема.   -  person user1975095    schedule 14.01.2013
comment
Почти уверен, что происходит что-то вроде этого: вы создаете экземпляр TableArray, назначаете его как dataSource для tv (что является слабым свойством), а затем после этого не существует сильных ссылок на arr, поэтому он освобождается. Сохраните arr где-нибудь, чтобы решить проблему.   -  person Carl Veazey    schedule 14.01.2013
comment
спасибо, карл, сработало!   -  person user1975095    schedule 14.01.2013


Ответы (2)


Бьюсь об заклад, у вас включен ARC (возможно, GC). NSTableView поддерживает слабую ссылку на свой источник данных, а вы не поддерживаете сильную ссылку на то же самое, поэтому ARC выпускает ваш источник данных до того, как вы закончите.

Обратите внимание, что исключительно редко бывает так, что источник данных перемещается таким образом. Почти наверняка это часть уровня управления вашего приложения, поскольку источник данных является каналом между таблицей и базовым хранилищем данных.

Скорее всего, он работает под MacRuby, потому что код немного отличается или из-за деталей реализации.

person bbum    schedule 14.01.2013

Было бы полезно знать, где вы инициализируете *tv. Я предполагаю, что вы поместили его в какой-то файл NIB, который загружается при запуске приложения.
Затем вы должны поместить IBOutlet NSTableView *tv; в ViewController, в идеале тот, который является подклассом UITableViewController. ссылка/выход tableView принадлежит там. Кроме того, было бы проще использовать сам viewController в качестве источника данных и установить соединение в Interface Builder.

person tompave    schedule 14.01.2013
comment
У меня уже есть -_-. Я просто пытаюсь настроить простое меню, используя массив в стиле меню itunes. Это работало в Macruby, делая почти то же самое. Это приложение для Mac OS X, а не для iOS. - person user1975095; 14.01.2013
comment
О, ну... вы не можете знать, что происходит за кулисами в MacRuby - person tompave; 14.01.2013