在调用NSTableView中显示时,NSMutableArray元素丢失

时间:2010-11-20 09:34:51

标签: macos cocoa osx-snow-leopard nstableview xcode3.2

我试图将数组的内容显示到表视图中。表视图具有单列。我的班级是 RKCandidate ,它是 NSWindowController 的子类。 RKCandidate也是'nib'文件的所有者在IB中我选择了文件所有者作为tableview的dataSource。

我使用的方法来更新tableview,

- (id) initWithClient:(TextInputController *) client
{
 self = [super initWithWindowNibName:@"RKCandidate"];
 if (self != nil) {
  _client = client;

 }
 return self;
}

- (void) dealloc
{
 [optionsArray release];
 [super dealloc];
}
- (void) updateCandidate {

 NSLog(@"updateCandidate Called.\n");

 optionsArray = [_client composedStringArray:self];
 [candidateOptions reloadData];

 NSLog(@"Retain Count of OptionsArray: %i\n",[optionsArray retainCount]);
 NSLog(@"Object Count of OptionsArray: %i\n",[optionsArray count]);
 NSLog(@"Address of Object: %i\n",[optionsArray objectAtIndex:0]);
 NSLog(@"Object: %@\n",[optionsArray objectAtIndex:0]);
 //NSString *benChar = [optionsArray objectAtIndex:0];
 //NSLog(@"Object Retain Count: %@i\n",[benChar retainCount]);
  }
#pragma mark TableView Data Source Methods
#pragma mark -

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {

 NSLog(@"Retain Count of OptionsArray: %i\n",[optionsArray retainCount]);
 NSLog(@"Object Count of OptionsArray: %i\n",[optionsArray count]);
 NSLog(@"Address of Object: %i\n",[optionsArray objectAtIndex:0]);
 NSLog(@"Object: %@\n",[optionsArray objectAtIndex:0]);
 //NSLog(@"Object Retain Count: %@i\n",[[optionsArray objectAtIndex:0] retainCount]);

 return [optionsArray count];
}

- (id)tableView:(NSTableView *)aTableView 
     objectValueForTableColumn:(NSTableColumn *)aTableColumn 
    row:(NSInteger)rowIndex {

 NSLog(@"Retain Count of OptionsArray: %i\n",[optionsArray retainCount]);
 NSLog(@"Object Count of OptionsArray: %i\n",[optionsArray count]);
 NSLog(@"Address of Object: %i\n",[optionsArray objectAtIndex:0]);
 NSLog(@"Object: %@\n",[optionsArray objectAtIndex:0]);
 //NSLog(@"Object Retain Count: %@i\n",[[optionsArray objectAtIndex:0] retainCount]);

 return [optionsArray objectAtIndex:rowIndex];
}

optionsArray 通过客户端的简单方法更新,方法如下,

-(NSMutableArray *) composedStringArray:(id)sender {

 NSLog(@"returning composedStringArray.\n");

 return convertBufferArray;
}

convertBufferArray 是一个可变数组。

第一次调用 updateCandidate 方法时。它工作得很好。但是在我更新客户端内的 convertBufferArray 数组后第二次调用时,问题就开始了。

从第一次调用 updateCandidate 方法时,控制台日志如下:

2010-11-20 09:03:35.385 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:35.385 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:35.386 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:35.386 Input Method Tester[7225:a0f] Object: ∆
2010-11-20 09:03:35.392 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:35.392 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:35.393 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:35.393 Input Method Tester[7225:a0f] Object: ∆
2010-11-20 09:03:35.397 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:35.397 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:35.398 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:35.399 Input Method Tester[7225:a0f] Object: ∆

表视图显示数组的内容。

但是当我只是在 Object 字符串中添加另一个字母时,如果 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn),字符串将被替换为空字符串*)aTableColumn行:( NSInteger)调用rowIndex。日志如下。

2010-11-20 09:03:38.349 Input Method Tester[7225:a0f] returning composedStringArray.
2010-11-20 09:03:38.350 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:38.351 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:38.352 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:38.353 Input Method Tester[7225:a0f] Object: ƍ
2010-11-20 09:03:38.354 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:38.354 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:38.354 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:38.355 Input Method Tester[7225:a0f] Object: ƍ
2010-11-20 09:03:38.358 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:38.358 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:38.359 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:38.359 Input Method Tester[7225:a0f] Object: 

正如您在上面日志的列表行中看到的那样,字符串为空。 tableView变空。

我在做什么事吗?我尝试过发布并保留 optionsArray ,但结果是一样的。我还尝试将 composedBufferArray 的内容复制到 optionsArray 中。我试过把

optionsArray = [_client composedStringArray:self];

进入init方法。所有情况的结果都是一样的。

请帮忙。过去两天我无法解决这个问题。请帮忙。

抱歉,我无法发布图片或链接,因为我在Stack Overflow中是全新的。

此致

Raiyan

1 个答案:

答案 0 :(得分:1)

首先:

不要调用retainCount

它对调试没用,返回的数字通常会非常误导。对于初学者来说,对象永远不会为保留计数返回0,因此,尝试使用retainCount查找过度释放的对象完全是徒劳的。

您的错误看起来像是内存管理问题。它没有崩溃只是运气。

你应该阅读Cocoa Memory Management Guide几次(直到它沉入 - 当我开始使用Objective-C时,我发现阅读语言文档几次非常有价值)。

您的-init方法看起来很可疑; _client = client;不会保留_client

您还应该在代码上使用“构建和分析”。 llvm静态分析器将识别代码中的大多数内存管理问题。

最后,学习使用僵尸检测仪器。有关详细信息,请参阅一些答案here