NSTableViewに値を設定できない2009/04/10 10:27

NSTableView
図のDummyXが表示されているのがNSTableViewで、番号と名前を表示させております。
ここは表示しているだけですが、内部的にはNSArrayなどで保持した情報が存在します。
例えば、ファイル名、パス情報、ファイル識別情報などになります。
ここまでは単なるロジックですので問題はありません。

NSTableViewへの表示処理は下記のデリゲートメソッドがおこないます。
- (int)numberOfRowsInTableView:(NSTableView *)aTableView;
- (id)tableView:(NSTableView *)aTableView
    objectValueForTableColumn:(NSTableColumn *)aTableColumn
    row:(int)rowIndex;
このメッソドで表示数と表示データを返してやればNSTableViewに反映されるわけです。

ところがこのデリゲートメソッドで値を返しているにもかかわらず表示に反映されないのです?
表示どころかフリーズしたようにも感じられます。
間違いなく呼び出しはされています。

/************************************************************/
じつは下記のようにダミーデータを作成していました。
int i;
fname = [[NSMutableArray alloc] init];
for (i=0; i<20; i++) {
  [fname addObject:[NSString stringWithFormat:@"Dummy%d",i]];
}

デリゲートメソッドtableViewは次のとおりですが、これは問題なしです。
- (id)tableView:(NSTableView *)aTableView
    objectValueForTableColumn:(NSTableColumn *)aTableColumn
    row:(int)rowIndex
{
  id identifier;
  identifier = [aTableColumn identifier];

  if([identifier isEqualToString:@"no"]){
    return [NSNumber numberWithInt:rowIndex];
  }
  else if([identifier isEqualToString:@"name"]){
    return [fname objectAtIndex: rowIndex];
  }
  else{
    return nil;
  }
}
ロジックとしてはおかしいところはありませんが、'Dummy00'が表示されませんでした。

【理由:】
メソッドの戻り値として返ってくるオブジェクトは、そのままではどこか知らない場所からの解除によって解放されている危険性が常にある。
よって、その危険を避ける必要がある場合、明示的に保持(retain)しなければならない。
もちろん保持した場合は、必要がなくなった時点で責任を持って解除(release)する必要がある。

for (i=0; i<20; i++) {
  [fname addObject:[NSString stringWithFormat:@"Dummy%d",i]];
}
[fname retain];  //← これがキモ!
[myTableview sizeToFit];  //再表示させる

このバージョンのCocoaのメモリ管理はかなり厄介な問題を持っているようです。