【问题标题】:ARC deallocate my NSmutablearray before NSTableview reloaddataARC 在 NSTableview reloaddata 之前取消分配我的 NSmutablearray
【发布时间】:2015-04-20 22:55:42
【问题描述】:

我的 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];

请帮忙!

【问题讨论】:

  • 你能显示更多代码吗?为什么是 ivar 而不是属性?你能显示你的UITableViewDataSource 协议代码的其余部分吗?

标签: objective-c cocoa nsmutablearray automatic-ref-counting


【解决方案1】:

首先,我建议在这里使用self.lOfSegments 而不是直接访问ivar 来使您的代码更清晰。 (ivar 缺少前导 _ 的事实也非常可疑,并提出了这是否是您认为的变量的问题。)

假设这是您认为的变量,并且您已覆盖标准行为以使 ivar 与属性匹配或创建显式 ivars(您都不应该这样做),有几个常见原因此类问题:

  • 最可能的原因是您在viewDidLoad 之前调用了初始化代码,然后viewDidLoad 炸毁了数组。许多事情可以在viewDidLoad 之前运行,而viewDidLoad 可以运行多次(至少这曾经是正确的;我必须研究iOS 6 中的视图加载更改是否使其保证运行一次.)
  • 在初始化代码运行时间和reloadData 运行时间之间,您可以通过其他方式重置lOfSegments。如果您可以可靠地使用self.,那么您可以覆盖setLOfSegments:,这样您就可以记录它。或者您可以将此属性标记为只读,以便阻止它。这是您应该使用属性而不是 ivars 的众多原因之一。
  • 设置代码在reloadData之前运行失败。确保日志语句在到达reloadData 之前实际打印并且在同一个队列中(队列标识符将是括号中NSLog 输出的一部分)。根据您的描述,我认为这不太可能,但这是一个常见问题。
  • 此对象有两个实例。确保运行初始化代码的对象与运行 reloadData 的对象相同。这是一个比你想象的更常见的错误。记录self并确保两种情况下的内存地址相同。

【讨论】:

  • 您好,感谢您的宝贵时间。我尝试改用属性,但没有区别。该属性被声明为(非原子,保留)。并且使用了点符号。
  • 您尝试覆盖 setLOfSegments: 以查看与 reloadData 相关的调用时间?
  • 其实你是对的,重载数据调用了不同的对象。它们具有完全不同的内存地址,如果我尝试在数组中加载更多数据,它会不断增长,但 reloadData 调用一个为 nil 的对象。我如何避免这种情况?
  • tis是self的日志:2015-02-20 12:04:26.832 MXFmetadataReader[83087:2141839] Self1: 2015-02-20 12:04:27.668 MXFmetadataReader[ 83087:2141839] Self2:
  • 谢谢它有效。我有两个 viewController 实例!
【解决方案2】:

看起来您在方法 viewDidLoad 中有同名变量 lOfSegments。所以在viewDidLoad 你使用堆栈变量,在numberOfRowsInTableView - 实例变量。

或者也许tableViewOutlete.dataSource指向不同的viewController

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多