我试过用两种方式检查NSString中子串的出现,两者都崩溃了。这是我从NSManagedObject的一个属性中获取的NSString对象。
使用NSRange
NSString *searchString = @"drive";
NSRange range = [text rangeOfString:searchString options:(NSCaseInsensitiveSearch)];
if (range.location != NSNotFound) {
NSLog(@"Found");
}
使用NSScanner
NSScanner *scanner = [NSScanner scannerWithString:text];
NSLog(@"%d",[scanner scanString:searchString intoString:nil]);
当text = @“drive”时,这两个都有效,但当文本为“i drive”或“drive to”时,导致EXC_BAD_ACCESS崩溃。如果文本是“idrive”或“driveto”,则没有任何反应。
更奇怪的是,有时示例抛出NSInvalidArgumentExceptions,说我试图将NSCFSet或DateComponents对象传递给rangeOfString:,我在我的应用程序中都没有使用它们。
有什么想法吗?
答案 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