我的 NSMutableArray lOfSegments 声明为 IVAR,已正确填充。在调试过程中,它在数组中显示了 4 个对象。
for (int x=0; [arrayOfSegmentsTcIn count]>x; x++) {
NSDictionary *segmentDic=[[NSDictionary alloc] initWithObjectsAndKeys: [arrayOfSegmentsNumbers objectAtIndex:x],@"segment",[arrayOfSegmentsTcIn objectAtIndex:x],@"tc_in",[arrayOfSegmentsTcOut objectAtIndex:x],@"tc_out", nil];
[lOfSegments addObject:segmentDic];
[myDMXML.segments addObject:segmentDic];
}
[self.xmlTCLable setStringValue:[myDMXML startTimeCode]];
[self.xmlDurationLable setStringValue:[myDMXML duration]];
[self xmlValidationCheck];
NSLog(@"arrayController:%@",[lOfSegments valueForKey:@"segment"]);
[self.tableViewOutlet reloadData];
NSLog 正确列出了数组,但是当执行 reloadData 时,代码跳转到
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [lOfSegments count];
}
数组为空。
该对象在 viewDidLoad 中初始化为
lOfSegments = [[NSMutableArray alloc]init];
请帮忙!
最佳答案
首先,我建议使用 self.lOfSegments 来让您的代码更加清晰,而不是直接访问 ivar。 (ivar 缺少前导 _
的事实也非常可疑,并提出了一个问题:这是否是您认为的变量。)
假设这是您认为的变量,并且您已经覆盖了标准行为以使 ivar 与属性匹配或创建了显式 ivars(您都不应该这样做),有几个常见原因此类问题:
- 最可能的原因是您在
viewDidLoad
之前调用了初始化代码,然后viewDidLoad
破坏了数组。许多事情可以在viewDidLoad
之前运行,并且viewDidLoad
可以运行多次(至少过去是这样;我必须研究 View 加载是否发生变化iOS 6 中保证只运行一次。) - 您可以通过其他方式在初始化代码运行和
reloadData
运行之间重置lOfSegments
。如果您能够可靠地使用self.
那么您可以覆盖setLOfSegments:
这样您就可以记录它。或者您可以将此属性标记为只读,以便可以阻止它。这是您应该使用属性而不是 ivars 的众多原因之一。 - 设置代码在
reloadData
之前运行失败。确保日志语句在到达reloadData
之前实际打印,并且位于同一队列上(队列标识符将是方括号中的NSLog
输出的一部分)。根据您的描述,我认为这不太可能,但这是一个常见问题。 - 该对象有两个实例。确保运行初始化代码的对象与运行
reloadData
的对象相同。这是一个比您想象的更常见的错误。记录self
并确保两种情况下的内存地址相同。
关于objective-c - ARC 在 NSTableview 重新加载数据之前释放我的 NSmutablearray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28609046/