与iOS6.1中仅有iPhone6和Xcode7的选项崩溃的字符串比较

时间:2015-12-03 11:13:47

标签: ios iphone ios9 xcode7

iOS9.1中的方法崩溃之前有效。它来自

(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString

方法是

- (void)filterContentForSearchText:(NSString*)searchText
{

    [self.searchResults removeAllObjects]; // First clear the filtered array.

    for (NSArray *contactsInSection in self.sections)
    {
        for (Contact *contact in contactsInSection)
        {
            NSArray *substringArray = [[contact displayName] componentsSeparatedByString:@", "];
            for (NSString *substring in substringArray)
            {
                NSComparisonResult result = [substring compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
                if (result == NSOrderedSame)
                {
                    [self.searchResults addObject:contact];
                    break;
                }
            }
        }
    }
}

崩溃的行是比较的行:[substring compare:searchText ....];

使用iPhone6设备在iOS9.1中出现问题。适用于iPhone5 !!!

以下是编译器的截图

enter image description here

1 个答案:

答案 0 :(得分:2)

问题在于你的范围

range:NSMakeRange(0, [searchText length])];

比接收器长:searchText = @"Po"长度为2个字符,而substring = @"n"长度只有1个字符。因此,该方法将引发异常:

  

range :执行比较的接收器范围。 范围不得超过接收器的范围。

     
    

重要

         

如果范围超出接收器的范围,则引发NSRangeException。

  
     

(参考:iOS API reference

也许您应该首先查看searchText.length <= substring.length