簡體   English   中英

Iphone sdk - 比較NSNumber時的奇怪行為

[英]Iphone sdk - Weird behavior when comparing NSNumber

我有一個項目,可以進行多項網絡操作。 為了便於控制,我給每個操作一個唯一的Id,定義為NSNumber,因為我必須使用對象和Array執行操作,這樣更容易:

#define LOGIN_OPERATION                     [NSNumber numberWithInt:0]
#define REGISTER_USER_OPERATION             [NSNumber numberWithInt:1]
#define VERIFY_USER_OPERATION               [NSNumber numberWithInt:2]
#define REGISTER_USER_DATA_OPERATION        [NSNumber numberWithInt:3]
#define FORGOT_PASSWORD_OPERATION           [NSNumber numberWithInt:4]
#define PASSTIME_REGISTER_OPERATION         [NSNumber numberWithInt:5]
#define PASSTIME_VERIFY_TOKEN_OPERATION     [NSNumber numberWithInt:6]
#define PASSTIME_OPERATION                  [NSNumber numberWithInt:7]
#define SERVICES_OPERATION                  [NSNumber numberWithInt:8]
#define MAIL_SUPPORT_OPERATION              [NSNumber numberWithInt:9]
#define UPDATE_USER_INFO_OPERATION          [NSNumber numberWithInt:10]
#define OBTAIN_CACS_OPERATION               [NSNumber numberWithInt:11]
#define GET_PREPAID_BALANCE_OPERATION       [NSNumber numberWithInt:12]
#define UPDATE_SERVICES_OPERATION           [NSNumber numberWithInt:13]

然后我簡單地在我的項目說明中使用了以下內容,這在去年一直很好用。

- (void) processNetworkResponseForOperation: (NSNumber*) opId {

    if (opId == SERVICES_OPERATION) {
        //do something
    } else if (opId == UPDATE_SERVICES_OPERATION) {
        //do something
    }

}

然而今天我添加了最后一個操作(數字13)和所有==操作結果為假,只是用那個數字!,我已經使用調試器來確保值是正確的,但我只能得到條件為真如果我使用: [opId isEqualToNumber:UPDATE_SERVICES_OPERATION]這很長。

我知道NSNumber是一個對象,因此==可能不是最好的選擇,但為什么它適用於項目中的所有其他操作但#13不起作用?

任何幫助將不勝感激。

編輯好我嘗試更大的數字,我有同樣的問題,但例如,如果我切換UPDATE_SERVICES_OPERATION數與另一個操作號,它現在執行UPDATE_SERVICES_OPERATION但它不會做我切換號碼的操作。 那么為什么它不適用於較新的數字:S,還是只是xcode上的構建問題? (我將重新啟動並更新)

你永遠不應該像在這里那樣直接比較NSNumber ,因為它是一個對象,而不是一個簡單的類型。 您當前的代碼取決於對象內存地址的相等性而不是它們的值。 在此處閱讀以獲取更多信息比較Obj-C中的對象

你永遠不應該使用==來比較對象的相等性,而是使用NSObject上的isEqual:函數,通常只有當你想確定你要比較的對象是同一個實例時。 下面的代碼應該可以解決您的問題。


- (void) processNetworkResponseForOperation: (NSNumber*) opId {

    if ([opId intValue] == [SERVICES_OPERATION intValue]) {
        //do something
    } else if ([opId intValue] == [UPDATE_SERVICES_OPERATION intValue]) {
        //do something
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM