iOS之NSString類中compare方法的陷阱

來源:互聯網
上載者:User

標籤:des   blog   io   ar   os   sp   on   資料   div   


typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};

其中,NSOrderedSame 表示比較的兩個字串完全一致, 同時,在這個枚舉中,它的值是 0.

字串比較在程式中很常見,比如:

    if ([str1 compare:@"some text"] == NSOrderedSame) {        // Do something    }    else {        // Do something else    }

但,如果如上中的str1為nil,根據Objective-C的訊息調用規則(方法調用),對nil發送的任何訊息,得到的返回都是nil。這樣的情況下,運行時是不會像C/C++那樣,出現null 指標的非法訪問而使得程式強行終止。也就是說,在Objective-C下面,即便str1為nil,也不會造成程式崩潰,而是會繼續運行。

那麼當str1為空白的時候,[str1 compare:@"some text"] 訊息的返回就會為nil。nil表示一個空的Objective-C對象,實際就是表示一個null 指標,而它代表的值就是0,與NSOrderedSame的值相等. 如此,回到最前面的if語句,如果str1為nil,那麼整個語句的值為真。這會給程式造成非常嚴重的問題,小則邏輯錯誤,UI顯示錯誤等,大則會造成資料泄漏等等。。。所以,一旦出現這種情況,還是很嚴重的。

筆者個人建議,以上代碼至少應該寫為:

    if (str1!=nil && [str1 compare:@"some text"] == NSOrderedSame) {}else{}

iOS之NSString類中compare方法的陷阱

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.