检查NSString崩溃的子串

nat*_*ate 5 iphone xcode objective-c ios5

我试过用两种方式检查NSString中子串的出现,两者都崩溃了.这是我从NSManagedObject的一个属性获取的NSString对象.

  1. 使用NSRange

    NSString *searchString = @"drive";

    NSRange range = [text rangeOfString:searchString options:(NSCaseInsensitiveSearch)];

    if (range.location != NSNotFound) { NSLog(@"Found"); }

    NSScanner *scanner = [NSScanner scannerWithString:text];

    NSLog(@"%d",[scanner scanString:searchString intoString:nil]);

    NSString *searchString = @"drive";

  2. 使用NSScanner

    NSRange range = [text rangeOfString:searchString options:(NSCaseInsensitiveSearch)];

    if (range.location != NSNotFound) { NSLog(@"Found"); }

    NSScanner *scanner = [NSScanner scannerWithString:text];

    NSLog(@"%d",[scanner scanString:searchString intoString:nil]);

    NSString *searchString = @"drive";

当text = @"drive"时,这两个都有效,但当文本为"i drive"或"drive to"时,导致EXC_BAD_ACCESS崩溃.如果文本是"idrive"或"driveto",则没有任何反应.

甚至更奇怪,有时示例抛出NSInvalidArgumentExceptions,说我试图将NSCFSet或DateComponents对象传递给rangeOfString:,我在我的应用程序中都没有使用它们.

有任何想法吗?

Bou*_*rne 5

以下对我来说非常有效,包括空间.

NSString *string = @"hello one two three";
if ([string rangeOfString:@"one two"].location == NSNotFound) {
    NSLog(@"string does not contain substring");
} else {
    NSLog(@"string contains substring!");
}
Run Code Online (Sandbox Code Playgroud)

如果您希望它不区分大小写,只需将字符串和搜索字符串转换为小写.你应该知道如何做到这一点.


Jer*_*myP 5

如果你有时得到EXC_BAD_ACCESS并且有时得到" 对象类型 - 你期望没有对方法做出反应"的消息,那么你很可能没有长时间保留对象并且在你到达之前它已经被解除分配你用吧.

如果到达目的地后内存没有被重用,事情似乎会起作用.如果空间已被重用于另一个对象并且完全对齐,即相同的指针,则会得到类似"x不响应选择器"的内容.如果它以指针未指向有效对象的方式被覆盖,那么你就会得到EXC_BAD_ACCESS