我正在尝试使用NSArrayController和绑定为NSImageCell
自定义NSTableView
以更改所选单元格的背景。因此,我创建了两个NSImage
图像并将其保留为单元格实例中的normalImage
和activeImage
,这意味着当单元格调用其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
答案 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 ?
基于此,您可能正在重新使用单元格,并且仅在开始时它们实际上正在初始化。
查看代码的某些部分非常有用:
NSTableView
单元格的创建代码。