当我自定义NSTableView单元时,OSX会做什么?

时间:2014-01-15 11:11:48

标签: macos cocoa nstableview

我正在尝试使用NSArrayController和绑定为NSImageCell自定义NSTableView以更改所选单元格的背景。因此,我创建了两个NSImage图像并将其保留为单元格实例中的normalImageactiveImage,这意味着当单元格调用其dealloc方法时,我应该释放这两个图像。我覆盖

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView

- (void) setObjectValue:(id) inObject

但我发现当我点击tableview中的任何单元格时,会调用单元格的dealloc方法。

所以我将NSLog(@"%@", self);放在dealloc方法和- (void)drawInteriorWithFrame:inView:中,我发现这两个实例不相同。

有人能告诉我每次点击任何单元格时调用dealloc的原因吗?为什么这两个实例不一样?当我在NSTableView中自定义单元格时OS X会做什么? 顺便说一句:我发现-init只被调用一次。为什么呢?


编辑:

我的手机代码

@implementation SETableCell {

    NSImage *_bgNormal;
    NSImage *_bgActive;

    NSString *_currentString;
}

- (id)init {

    if (self = [super init]) {

        NSLog(@"setup: %@", self);
        _bgNormal = [[NSImage imageNamed:@"bg_normal"] retain];
        _bgActive = [[NSImage imageNamed:@"bg_active"] retain];
    }
    return self;
}


- (void)dealloc {

//    [_bgActive release]; _bgActive = nil;
//    [_bgNormal release]; _bgNormal = nil;
//    [_currentString release]; _currentString = nil; 

    NSLog(@"dealloc: %@", self);
    [super dealloc];
}

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {

    NSLog(@"draw: %@", self);
    NSPoint point = cellFrame.origin;
    NSImage *bgImg = self.isHighlighted ? _bgActive : _bgNormal;
    [bgImg drawAtPoint:p fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

    NSPoint strPoint = cellFrame.origin;
    strPoint.x += 30;
    strPoint.y += 30;
    [_currentString drawAtPoint:strPoint withAttributes:nil];
}

- (void) setObjectValue:(id) inObject {

    if (inObject != nil && ![inObject isEqualTo:_currentString]) {

        [self setCurrentInfo:inObject];
    }
}

- (void)setCurrentInfo:(NSString *)info {

    if (_currentString != info) {

        [_currentString release];
        _currentString = [info copy];
    }
}

@end

1 个答案:

答案 0 :(得分:0)

作为正常建议,您应该转移到ARC,因为它会处理您手动执行的大多数内存管理任务,例如保留,发布。我的答案将假设您正在使用手动内存管理:

Can anyone tell me why dealloc is called every time I click any cell ? 

发生这种情况的唯一方法是,如果您正在释放或自动释放您的手机。如果要重新使用单元格,则不应将其取消分配。

Why these tow instance are not same ?

如果您正在重复使用它们,您单击的单元格以及已取消分配的单元格,它们应该是不同的。密切关注你的两个问题,一方面你假设你在点击它时发布了同一个单元格,另一方面你看到它们是不同的。

What does Apple do when I custom the cell in NSTableView ?
Apple作为一家公司?或Apple在您使用的本机框架中?我假设您要使用第二个:自定义单元格只是NSTableView所期望的某个子类,它应该与普通单元格和自定义实现相同。

BTW: I found that the init is called only once, and why ?

基于此,您可能正在重新使用单元格,并且仅在开始时它们实际上正在初始化。

查看代码的某些部分非常有用:

  1. 您的手机代码
  2. 您的NSTableView单元格的创建代码。