iOS在搜索在线数据库时出现NSRangeException崩溃

时间:2014-10-28 20:45:31

标签: ios objective-c

当我尝试使用UISearchBar / searchDisplayController搜索某些文字时,我发现偶然崩溃。我通过 JSON 从在线数据库中搜索数据,所有内容在99%的情况下都能正常运行。我使用textDidChange委托方法搜索用户在搜索中输入的内容。

以下是我遇到的崩溃示例:

Fatal Exception: NSRangeException 
-[__NSCFArray objectAtIndex:]: index (2) beyond bounds (2)

Fatal Exception: NSRangeException 
*** -[__NSArrayI objectAtIndex:]: index 6 beyond bounds [0 .. 0]

我很难确定导致崩溃的原因,因为当我尝试重新创造导致崩溃的原因时,我无法做到。该应用程序将工作好几天和大量的测试" (例如我一遍又一遍地输入查询)。然后随机会崩溃,然后几天都没有。

以下是一些更新我的TableViews

的委托方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [[SearchInfo sharedInfo].searchArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

////////Adds search data to local Array to pass it around the applicatio//////
searchData = [[SearchInfo sharedInfo].searchArray objectAtIndex:indexPath.row];
static NSString *cellIdentifier = @"Cell";

//Standard Table View Cell
UITableViewCell *searchCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (searchCell==nil) {

searchCell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}


///////////Search bar tableview//////////
if (tableView == self.searchDisplayController.searchResultsTableView) {
searchCell.textLabel.text = [SearchData objectForKey:@"title"];
searchCell.detailTextLabel.text = [SearchData objectForKey:@"system_title"];
}

///////Builds the custom tableview cell//////
UILabel *searchTitleLabel = (UILabel*)[searchCell viewWithTag:1];
searchTitleLabel.text = [searchData objectForKey:@"title"];
UILabel *systemTitleLabel = (UILabel *)[searchCell viewWithTag:2];
systemTitleLabel.text = [searchData objectForKey:@"system_title"];
UILabel *devLabel = (UILabel*)[searchDataCell viewWithTag:3];

if([[searchData objectForKey:@"developer"] isKindOfClass:[NSString class]])

{
if([[searchData objectForKey:@"developer"] isEqualToString:@""] || [[searchData objectForKey:@"developer"] isEqualToString:@"<null>"])
{
developerLabel.text = @"Unknown";
}
else {
developerLabel.text = [NSString stringWithFormat:@"%@",[searchData objectForKey:@"developer"]];
}

}
else {
developerLabel.text = @"Unknown";
}



////////////////////////////////////////////////////////////////
return searchCell;
}

如果您还有其他需要,请告诉我!我把头发拉过来。

以下是崩溃日志:

Thread : Fatal Exception: NSRangeException
0  CoreFoundation                 0x2577cc1f __exceptionPreprocess + 126
1  libobjc.A.dylib                0x32f27c8b objc_exception_throw + 38
2  CoreFoundation                 0x25691a8d CFRunLoopRemoveTimer
3  Archive.vg                     0x00073ddb -[CenterViewController tableView:cellForRowAtIndexPath:] (CenterViewController.m:192)
4  UIKit                          0x28f018c7 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 474
5  UIKit                          0x28f0198b -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 54
6  UIKit                          0x28ef70e1 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2268
7  UIKit                          0x28d0f2ff -[UITableView layoutSubviews] + 186
8  UIKit                          0x28c394d7 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 514
9  QuartzCore                     0x28661a0d -[CALayer layoutSublayers] + 136
10 QuartzCore                     0x2865d3e5 CA::Layer::layout_if_needed(CA::Transaction*) + 360
11 QuartzCore                     0x2865d26d CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
12 QuartzCore                     0x2865cc51 CA::Context::commit_transaction(CA::Transaction*) + 224
13 QuartzCore                     0x2865ca55 CA::Transaction::commit() + 324
14 QuartzCore                     0x2865692d CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 56
15 CoreFoundation                 0x257433b5 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
16 CoreFoundation                 0x25740a73 __CFRunLoopDoObservers + 278
17 CoreFoundation                 0x25740e7b __CFRunLoopRun + 914
18 CoreFoundation                 0x2568f211 CFRunLoopRunSpecific + 476
19 CoreFoundation                 0x2568f023 CFRunLoopRunInMode + 106
20 GraphicsServices               0x2ca880a9 GSEventRunModal + 136
21 UIKit                          0x28c9b1d1 UIApplicationMain + 1440
22 Archive.vg                     0x0009d0cd main (main.m:16)
23 libdyld.dylib                  0x334a7aaf start + 2

2 个答案:

答案 0 :(得分:0)

您可以为异常设置断点。这对调试很有帮助

您可以在菜单Debug-&gt; Breakpoints-&gt; Create Exception Breakpoint

上启用它

下次你遇到异常时,你会看到它来自哪里。

<强>加了:

@synchronized([SearchInfo sharedInfo].searchArray) { ... update table here ... }

答案 1 :(得分:0)

  

你是对的,随着用户输入文字而改变。这是问题的根源吗?

是。在加载表时,您需要保持数据的一致性。如果你想对它懒惰,只需进行indexPath.row < [[SearchInfo sharedInfo].searchArray count]检查并返回一个空单元格。这不是最好的解决方案。实际上,您不应该经常更改数据;如果您确实更改了大量数据,请为每个数据集创建一个新UITableView并静态分配其数据源,以确保它们独立加载数据。