我有UIViewController
包含UITableView
,当我调用方法“requireObjects”时,最后填充数组以配置表。我声明cellForRowAtIndexPath
方法正常工作,并根据[_arrID count]
将一些单元格出列。
每个填充的数组都与所有其他数组具有匹配的索引。例如,arrID[5] = 453
对应arrNames[5] = "Jean"
,对应arrStyle[5] = "Angry"
,对应arrLocation[5] = "New York"
,对应arrProfileSnaps[5] = jean.png
。
例如,这5个数组组成了tableView中的第五个单元格。方法“requireObjects”成功,表格构建正确。当我在运行时调用此方法时会出现问题。我希望单击按钮时该方法停止并重复。或绝望的时候,方法结束执行并在我点击按钮时重复也是好的。但不幸的是我的应用程序崩溃了。代码如下:
- (void)requireObjects{
@try {
//threadsQueue is a NSOperationQueue allocated and initialized in viewDidLoad method
[threadsQueue cancelAllOperations];
[threadsQueue waitUntilAllOperationsAreFinished];
[_arrID removeAllObjects];
[_arrNames removeAllObjects];
[_arrStyle removeAllObjects];
[_arrLocation removeAllObjects];
[_arrProfileSnaps removeAllObjects];
_arrNames = [[NSMutableArray alloc] init];
_arrStyle = [[NSMutableArray alloc] init];
_arrLocation = [[NSMutableArray alloc] init];
_arrProfileSnaps = [[NSMutableArray alloc] init];
[threadsQueue addOperation:[NSBlockOperation blockOperationWithBlock: ^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
CGRect activityFrame = CGRectMake(self.view.center.x, self.view.center.y, 0.0, 0.0);
_activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:activityFrame];
[[self.view superview] addSubview:_activityIndicator];
_activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
_activityIndicator.color = [UIColor whiteColor];
[_activityIndicator startAnimating];
[_tableView reloadData];
}];
_arrID = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil]];
for (int i = 0; i < [_arrID count]; i++) {
[_arrStyle addObject:@“..”];
[_arrNames addObject:@".."];
[_arrLocation addObject:@“..”];
[_arrProfileSnaps addObject:[UIImage imageNamed:@"blank"]];
}
[[NSOperationQueue mainQueue] addOperationWithBlock: ^{
[self.tableView reloadData];
[_activityIndicator stopAnimating];
}];
}]];
}
@catch (NSException *exception) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"An exception has occurred" message:[NSString stringWithFormat:@"%@",exception] delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
[alert show];
}
}
应用程序在我执行[_arrNames insertObject:...
的位置的for循环的一次迭代中崩溃。错误:
由于未捕获的异常'NSRangeException'而终止应用程序,原因: ' * - [__ NSArrayM objectAtIndex:]:索引0超出范围为空 阵'
奇怪的是,无论何时我调用它,该方法都会成功,但只有当它在已经运行时调用它时才会崩溃!
答案 0 :(得分:1)
您正在操作队列上调用[_arrID removeAllObjects];
和_arrNames
等相同,这可能会同时运行,具体取决于调用哪个线程requireObjects:
而不一定是线程安全。尝试在创建块之前初始化和设置对象,并使用变量传递而不是通过存储在对象中的变量进行通信。