ARC在NSTableview reloaddata之前释放我的NSmutablearray

时间:2015-02-19 14:36:33

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

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

数组为空。

Object在viewDidLoad中初始化为

lOfSegments  = [[NSMutableArray alloc]init];

请帮助!

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

看起来您在方法lOfSegments中拥有同名viewDidLoad的变量。因此,在viewDidLoad中,您在numberOfRowsInTableView - 实例变量。

中使用堆栈变量

或者tableViewOutlete.dataSource指向不同的viewController