iOS開發(fā)陷阱之NSString - compare
NSString有多個(gè)compare相關(guān)方法:
-(NSComparisonResult)compare:(NSString *)string;
-(NSComparisonResult)compare:(NSString *)stringoptions:(NSStringCompareOptions)mask;
-(NSComparisonResult)compare:(NSString *)stringoptions:(NSStringCompareOptions)maskrange:(NSRange)compareRange;
-(NSComparisonResult)compare:(NSString *)stringoptions:(NSStringCompareOptions)mask range:(NSRange)compareRangelocale:(id)locale;
NSComparisonResult 是定義的一個(gè)枚舉,定義如下:
typedefNS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L,NSOrderedSame, NSOrderedDescending};
其中,NSOrderedSame 表示比較的兩個(gè)字符串完全一致, 同時(shí)摹恰,在這個(gè)枚舉中捅位,它的值是 0.
字符串比較在程序中很常見,比如:
if ([str1compare:@"some text"] == NSOrderedSame) {
// Do something
}
else {
// Do something else
}
但杆查,如果如上中的str1為nil扮惦,根據(jù)Objective-C的消息調(diào)用規(guī)則(方法調(diào)用),對nil發(fā)送的任何消息亲桦,得到的返回都是nil崖蜜。這樣的情況下,運(yùn)行時(shí)是不會像C/C++那樣客峭,出現(xiàn)空指針的非法訪問而使得程序強(qiáng)行終止豫领。也就是說,在Objective-C下面舔琅,即便str1為nil等恐,也不會造成程序崩潰,而是會繼續(xù)運(yùn)行。
那么當(dāng)str1為空的時(shí)候课蔬,[str1 compare:@"some text"]消息的返回就會為nil囱稽。nil表示一個(gè)空的Objective-C對象,實(shí)際就是表示一個(gè)空指針二跋,而它代表的值就是0战惊,與NSOrderedSame的值相等.如此,回到最前面的if語句扎即,如果str1為nil吞获,那么整個(gè)語句的值為真。這會給程序造成非常嚴(yán)重的問題谚鄙,小則邏輯錯(cuò)誤各拷,UI顯示錯(cuò)誤等,大則會造成數(shù)據(jù)泄漏等等襟锐。撤逢。。所以粮坞,一旦出現(xiàn)這種情況蚊荣,還是很嚴(yán)重的。
筆者個(gè)人建議莫杈,以上代碼至少應(yīng)該寫為:
if (str1!=nil && [str1 compare:@"some text"] ==NSOrderedSame) {
// Do something
}
else {
// Do something else
}