我有一个启用 ARC 的项目,在 IB 中我创建了一个窗口,其中包含我认为只是配置的源列表组件NSOutlineView
。我正在使用神奇的委托方法:
- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
我根本找不到任何文件。一旦实现了这个方法,我的大纲视图中的根节点就会出现,在这个根节点上我的整个模型都会被释放。然后,当我尝试扩展根节点时,应用程序立即崩溃,因为模型不再存在。
如果我不使用这种方法,我的模型仍然存在,源列表有效,但没有出现任何单元格(可以理解)。我真的没有在这里做任何花哨的事情。
我以前从未在 ARC 上遇到过此类问题,但为时已晚,所以我有可能做了一些愚蠢的事情,只是看不到它。这是完整的代码:
@implementation RLListController
- (void)awakeFromNib
{
RLPerson *stan = [[RLPerson alloc] initWithName:@"Stan"];
RLPerson *eric = [[RLPerson alloc] initWithName:@"Eric"];
RLPerson *ken = [[RLPerson alloc] initWithName:@"Ken"];
RLPerson *andrew = [[RLPerson alloc] initWithName:@"Andrew"];
RLPerson *daniel = [[RLPerson alloc] initWithName:@"Daniel"];
RLPerson *aksel = [[RLPerson alloc] initWithName:@"Aksel"];
[stan addChild:eric];
[stan addChild:ken];
[stan addChild:andrew];
[ken addChild:daniel];
[daniel addChild:aksel];
self.people = [@[stan] mutableCopy];
}
#pragma mark - Source List dataSource
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
RLPerson *person = item;
return (item != nil) ? [person.children count] : [self.people count];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
RLPerson *person = item;
return (item != nil) ? [person.children count] > 0 : YES;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
{
RLPerson *person = item;
return (item != nil) ? [person.children objectAtIndex:index] : [self.people objectAtIndex:index];
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
RLPerson *person = item;
return person.name;
}
- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
RLPerson *person = item;
NSTableCellView *cell = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
cell.objectValue = person;
[cell.textField setStringValue:person.name];
return cell;
}
@end
@implementation RLPerson
- (id)initWithName:(NSString *)name
{
self = [super init];
if(self)
{
_name = [name copy];
_children = [[NSMutableArray alloc] initWithCapacity:0];
}
return self;
}
- (void)addChild:(RLPerson *)child
{
[_children addObject:child];
}
- (void)dealloc
{
NSLog(@"dealloc");
}
@end