[英]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.