2014-01-15 2 views
0

Я пытаюсь настроить NSImageCell на NSTableView, используя NSArrayController и привязки, чтобы изменить фон ячейки, которая выбрана. Итак, я создал два изображения NSImage и сохранил их как normalImage и activeImage в экземпляре ячейки, что означает, что я должен выпустить эти два изображения, когда ячейка вызывает свой метод dealloc. И я переопределитьЧто делает OSX при настройке ячейки NSTableView?

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

и

- (void) setObjectValue:(id) inObject 

Но я считаю, что, когда я нажимаю любую ячейку в Tableview, dealloc метод ячейки называется.

Поэтому я положил NSLog(@"%@", self); в метод dealloc и - (void)drawInteriorWithFrame:inView:, и я обнаружил, что эти два экземпляра не совпадают.

Может ли кто-нибудь сказать мне, почему dealloc вызывается каждый раз, когда я нажимаю любую ячейку? Почему эти два экземпляра не совпадают? Что делает OS X, когда я настраиваю ячейку в NSTableView? BTW: Я обнаружил, что -init вызывается только один раз. Зачем?


EDIT:

Моего код ячейки

@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

Apple Inc.не сделают ничего кому-либо, если вы не обратитесь к ним, может быть, через магазин Apple и т. д. –

+1

вы все еще в эпоху MRC? Почему вы не используете ARC? –

+0

@AnoopVaidya Это старый проект –

ответ

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 код создания ячейки.
+0

Я просто перетащил один TableView в xib-файл и изменил класс ячейки таблицы на свой класс ячеек. Я обнаружил, что экземпляр, зарегистрированный в методе dealloc, никогда не вызывал 'init', поэтому, когда он был создан? Если повторно используются ячейки, сколько ячеек (я)? –

Смежные вопросы