检查NSString崩溃的子串

时间:2011-09-05 15:27:15

标签: iphone objective-c xcode ios5

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

  1. 使用NSRange

    NSString *searchString = @"drive";

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

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

  2. 使用NSScanner

    NSScanner *scanner = [NSScanner scannerWithString:text];

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

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

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

    有什么想法吗?

2 个答案:

答案 0 :(得分: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!");
}

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

答案 1 :(得分:5)

如果您有时获得EXC_BAD_ACCESS并且有时会收到消息“对象类型 - 您不希望不响应方法”很可能你没有足够长时间地保留这个物体,并且在你到达你使用它的地方之前就已经解除了分配。

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