ARC 在 NSTableview 重新加载数据之前取消分配我的 NSmutablearray
ARC deallocate my NSmutablearray before NSTableview reloaddata
我的 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 与 属性 匹配或创建了明确的 ivar(您都不应该这样做),此类问题有几种常见原因:
- 最可能的原因是您在
viewDidLoad
之前调用了初始化代码,然后 viewDidLoad
破坏了数组。许多事情可以在 viewDidLoad
之前 运行,并且 viewDidLoad
可以 运行 不止一次(至少这曾经是真的;我必须研究视图是否-加载 iOS 6 中的更改使其 gua运行teed 成为 运行 一次。)
- 在初始化代码 运行 和
reloadData
运行 之间,您可以通过其他方式重置 lOfSegments
。如果你能可靠地使用 self.
那么你可以覆盖 setLOfSegments:
这样你就可以记录它。或者您可以将此 属性 标记为只读,这样您就可以阻止它。这是您应该使用属性而不是 ivars 的众多原因之一。
reloadData
前设置代码失败运行。确保日志语句在到达 reloadData
之前实际打印并且在同一队列中(队列标识符将是 NSLog
输出的一部分,括号中)。根据您的描述,我认为这不太可能,但这是一个常见问题。
- 这个对象有两个实例。确保 运行 您的初始化代码的对象与 运行
reloadData
的对象相同。这是一个比您想象的更常见的错误。记录 self
并确保两种情况下的内存地址相同。
看起来您在方法 viewDidLoad
中有同名变量 lOfSegments
。所以在 viewDidLoad
你使用堆栈变量,在 numberOfRowsInTableView
- 实例变量。
或者 tableViewOutlete.dataSource
指向不同的 viewController
我的 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 与 属性 匹配或创建了明确的 ivar(您都不应该这样做),此类问题有几种常见原因:
- 最可能的原因是您在
viewDidLoad
之前调用了初始化代码,然后viewDidLoad
破坏了数组。许多事情可以在viewDidLoad
之前 运行,并且viewDidLoad
可以 运行 不止一次(至少这曾经是真的;我必须研究视图是否-加载 iOS 6 中的更改使其 gua运行teed 成为 运行 一次。) - 在初始化代码 运行 和
reloadData
运行 之间,您可以通过其他方式重置lOfSegments
。如果你能可靠地使用self.
那么你可以覆盖setLOfSegments:
这样你就可以记录它。或者您可以将此 属性 标记为只读,这样您就可以阻止它。这是您应该使用属性而不是 ivars 的众多原因之一。 reloadData
前设置代码失败运行。确保日志语句在到达reloadData
之前实际打印并且在同一队列中(队列标识符将是NSLog
输出的一部分,括号中)。根据您的描述,我认为这不太可能,但这是一个常见问题。- 这个对象有两个实例。确保 运行 您的初始化代码的对象与 运行
reloadData
的对象相同。这是一个比您想象的更常见的错误。记录self
并确保两种情况下的内存地址相同。
看起来您在方法 viewDidLoad
中有同名变量 lOfSegments
。所以在 viewDidLoad
你使用堆栈变量,在 numberOfRowsInTableView
- 实例变量。
或者 tableViewOutlete.dataSource
指向不同的 viewController