从SearchBar查询执行NSRange后抛出的异常

时间:2013-09-16 23:02:13

标签: iphone ios arrays memory-management nsdictionary

我已将SearchBar功能添加到我的tableview中。(注意我将SearchBar拖到View而不是TableView上)。我有以下子进程,当它到达NSRange函数时抛出异常错误以使程序崩溃。以下是我的SearchBar方法。你能看到任何可能导致错误的东西吗? (我在下面列出了摘录表格调试屏幕)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
if (searchText.length==0){
    boolIsFiltered = NO;
}
else
{
    boolIsFiltered = YES;
    arrayFilteredproducts = [[NSMutableArray alloc]init];

    for (NSString *str in arrayProducts) {
        NSRange stringRange  = [str rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if (stringRange.location!=NSNotFound){
            [arrayFilteredproducts addObject:str];
        }
    }
}

}

以下是创建arrayProducts的方法。

- (void)request:(SFRestRequest *)request didLoadResponse:(id)jsonResponse {
NSMutableArray *records = [jsonResponse objectForKey:@"records"];
arrayProducts = records;
[self.tableProducts reloadData];

}

以下是调试屏幕中的转储:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM rangeOfString:options:]: unrecognized selector sent to instance 0x176c5a80 First throw call stack:

(0x30076f8b 0x3a5166af 0x3007a927 0x3007920b'

2 个答案:

答案 0 :(得分:1)

您应该检查JSON响应实际上是关键字"记录"的对象的字符串数组。 您可以在代码中放置断点并在控制台中输入" po jsonResponse",以查看json响应的样子。我认为你期待回应看起来像......

{   "records" : [ "aString" , "anotherString", "so on" ] } 

但我担心json数据可能看起来更像......

{   "records" : [ {...}, {...}, {...} ] }

因此,而不是键的对象"记录"像你想象的那样是一个字符串数组,它更像是一个字典数组。从您收到的运行时错误中可以看出这一点。

你可以为你的代码添加更多逻辑来补偿,正如neilco已经指出的,一个好的方法是在调用rangeOfString之前检查str实际上是NSString的一个实例:options:

if (  [str isKindOfClass:[NSString class]]  )
{
   // code in here
}

答案 1 :(得分:0)

答案在异常消息中:

  

' - [__ NSDictionaryM rangeOfString:options:]:无法识别的选择器

这表示strNSDictionary。在致电str

之前,您应该检查NSString实际上是rangeOfString:options:的实例