繁体   English   中英

仅在iPhone6和Xcode7上的iOS9.1中,带有选项的字符串比较会崩溃

[英]string comparison with options crashes in iOS9.1 with iPhone6 only and 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 !!!

这是编译器的屏幕截图

在此处输入图片说明

问题是你的范围

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

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

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

重要

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

(参考: iOS API参考

也许您应该首先检查searchText.length <= substring.length吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM