NSArray с пользовательскими объектами в NSTableDataSource - PullRequest
0 голосов
/ 05 апреля 2009

Я пытаюсь создать объект, совместимый с NSTableDataSource, и передать этот объект NSTableView как DataSource, однако, когда таблица пытается отобразить данные, происходит сбой.

@interface NSArrayDataSource : NSObject{
    NSArray* internalArray;
}
-(id) initWithArray: (NSArray*) objects;
-(int)numberOfRowsInTableView:(NSTableView *)aTableView;
-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
@end


@implementation NSArrayDataSource 

-(id) initWithArray: (NSArray*) objects{
    if(self = [super init])
    {
        internalArray = [[NSArray alloc] initWithArray:objects];
    }
    return self;
}

-(int)numberOfRowsInTableView:(NSTableView *)aTableView{
    return [internalArray count];
}

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex{
    id obj = [internalArray objectAtIndex:rowIndex];
        // when I debug, I get same pointers with invalid data
        // each object has "name" message
        // this following line gives invalid pointer and
        // it crashes
    return [obj name];
}

-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex{
}

@end

Может кто-нибудь сказать мне, в чем может быть проблема?

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

NSArrayDataSource* nsds = [[NSArrayDataSource alloc] initWithArray: myArray];
[tableView setDataSource:nsds];

У меня есть одно сомнение: NSArray вызывает [retain] для каждого объекта при создании нового объекта или просто хранит значения указателя?

Предположим, что имя моего объекта - "SLProject", тогда когда я отлаживаю, в методе init я правильно вижу значения в окне отладки, но в методе делегирования tableView отладчик internalArray отображает объект типа "NSKVONotifying_SLProject", и они указывают на недопустимые данные, однако адреса верны.

Ответы [ 2 ]

1 голос
/ 05 апреля 2009

Моим первым подозрением будет то, что свойство -name NSString класса SLProject не сохраняется. Это помогло бы узнать сообщение в журнале отладки, описывающее сбой, потому что без этого мы просто догадываемся.

Что касается префикса "NSKVONotifying_" в имени вашего класса, то во время выполнения Cocoa создаст подкласс вашего объекта, когда вы используете Key Value Observing. Это нормально и вряд ли является причиной вашей проблемы.

1 голос
/ 05 апреля 2009

В ответ на ваш вопрос о создании NSArray объекта, да, каждый объект получает сообщение retain при добавлении в массив и сообщение release при удалении. Из документов Apple:

Как правило, объекты, которые вы добавляете в массив, не копируются; скорее, каждый объект получает сообщение сохранения, прежде чем его идентификатор добавляется в массив. Когда объект удаляется из массива, ему отправляется сообщение об освобождении.

Что касается функции name вашего объекта, как она реализована? Если вы замените [obj name] на [obj description], это все равно приведет к сбою вашего приложения?

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