Объект модели вызывается в приложении сбоя метода источника данных NSOutlineView - PullRequest
1 голос
/ 24 июня 2011

У меня непонятная проблема в надежде, что кто-то может помочь:

У меня есть модельный объект, который называется Road.Вот интерфейс.

@@@

@interface RoadModel : NSObject {

NSString *_id;
NSString *roadmapID;
NSString *routeID;

NSString *title;
NSString *description;
NSNumber *collapsed;
NSNumber *isRoute;
NSString *staff;
NSNumber *start;

NSArray *staffList;
NSMutableArray *updates;
NSMutableArray *uploads;
NSMutableArray *subRoads;

}

@property (nonatomic, copy) NSString *_id;
@property (nonatomic, copy) NSString *roadmapID;
@property (nonatomic, copy) NSString *routeID;

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *description;
@property (nonatomic, copy) NSNumber *collapsed;
@property (nonatomic, copy) NSNumber *isRoute;
@property (nonatomic, copy) NSString *staff;
@property (nonatomic, copy) NSNumber *start;

@property (nonatomic, copy) NSArray *staffList;
@property (nonatomic, copy) NSMutableArray *updates;
@property (nonatomic, copy) NSMutableArray *uploads;
@property (nonatomic, copy) NSMutableArray *subRoads;

- (id)initWithJSONObject:(NSDictionary *)JSONObject;

@end

Эта часть в порядке.

Чтобы дать вам некоторое представление, я перевожу группу JSON в правильный объект модели, чтобы с ним было легче работать.

Теперь я пытаюсь отобразить это в NSOutlineView.,Вот где проблема.В частности, я создал таблицу и источник данных.

- (id)initWithRoads:(NSArray *)roads {

    if (self = [super init])
        root = [[NSMutableArray alloc] initWithArray:roads];

    return self;

}

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {

    if (item == nil)
        return root.count;

    return 0;

}

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {

    return NO;

}

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {

    if (item == nil)
        item = root;

    if (item == root)
        return [root objectAtIndex:index];

    return nil;

}

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {

    return [item title];

}

В последнем методе источника данных он пытается вернуть свойство строки "title" объекта модели, но по какой-то причине каждый раз происходит сбой.Я проверил, что метод получает правильный объект (я проверил [item class] description], и это правильный объект), но по какой-то причине, если я вызываю какой-либо из методов доступа к объектам, приложение немедленно вылетает.

Это полностью озадачивает, потому что в методе init я могу перебирать root (массив объектов RoadModel) и печатать любые его свойства без проблем.Это происходит только тогда, когда я пытаюсь получить доступ к свойствам любого из методов источника данных.Интересно, есть ли что-то запоминающееся, что происходит за кулисами, и я не обеспечиваю это.

Если вы сможете пролить свет на эту ситуацию, это будет с благодарностью!

Заранее спасибо!

1 Ответ

1 голос
/ 24 июня 2011

Обычно такие вещи возникают из-за чрезмерного освобождения объектов. К тому времени, когда вы доберетесь до сбоя метода, ваш источник данных или корневой массив будут освобождены. Не забывайте, что NSOutlineView поддерживает слабую ссылку на свой источник данных. Это означает, что в мире подсчета ссылок он не сохраняет источник данных, а в мире ГХ ссылка не достаточна для того, чтобы остановить сбор данных.

Вам необходимо сохранить сохраненную / сильную ссылку в другом месте.

...