我试图将数组的内容显示到表视图中。表视图具有单列。我的班级是 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
答案 0 :(得分:1)
首先:
它对调试没用,返回的数字通常会非常误导。对于初学者来说,对象永远不会为保留计数返回0,因此,尝试使用retainCount
查找过度释放的对象完全是徒劳的。
您的错误看起来像是内存管理问题。它没有崩溃只是运气。
你应该阅读Cocoa Memory Management Guide几次(直到它沉入 - 当我开始使用Objective-C时,我发现阅读语言文档几次非常有价值)。
您的-init
方法看起来很可疑; _client = client;
不会保留_client
。
您还应该在代码上使用“构建和分析”。 llvm静态分析器将识别代码中的大多数内存管理问题。
最后,学习使用僵尸检测仪器。有关详细信息,请参阅一些答案here。