一般我们判断某个字符串中是否包含指定的字符串时,往往会用到rangeOfString:方法,但这里就会有个小细节需要注意的,最近就发现在程序中出现了这个bug。细节没处理好吧,但往往细节决定成败。
//NSString *testString = @"this is a string!";
//rangeOfString:如果字符串为nil,那 != NSNotFound 都是成立的,即永远都是true
NSString *testString = nil;
BOOL found = [testString rangeOfString:@"this"].location != NSNotFound;
NSLog(@"found:%@",@(found));//永远都是1
我们应该使用下面的几种方式来修改我们的判断。
//所以造成在程序中可能会出现判断出错的bug,正常是如果这个字符串为空时,应是false,所以应用要用下面的3种方式判断
if (testString && [testString rangeOfString:@"this"].location != NSNotFound) {
NSLog(@"testString: found1!%@",testString);
}
//或者使用下面的方式
if ([testString rangeOfString:@"this"].length > 0) {
NSLog(@"testString: found2!%@",testString);
}
//扩展:iOS8以后可以使用containsString:
if ([testString containsString:@"this"]) {
NSLog(@"testString: found3!%@",testString);
}
这样在判断时就不会出现错误了。所以特别要注意像nil、NSNULL、@""等空值判断的处理,可以统一封装成一个函数。
网友评论