Iphone sdk - 比较 NSNumber 时的奇怪行为

标签 iphone objective-c ios operator-keyword nsnumber

我有一个项目可以执行多个网络操作。为了便于控制,我给每个操作一个唯一的 ID,定义为一个 NSNumber,因为我必须对对象和数组执行操作,这样更容易:

#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)并且所有 == 操作结果都是 false,只是那个数字!,我已经使用调试器来确保该值是正确的,但我只能得到条件true 如果我使用:[opId isEqualToNumber: UPDATE_SERVICES_OPERATION] 这很长。

我知道 NSNumber 是一个对象,因此 == 可能不是最佳选择,但为什么它适用于项目中的所有其他操作,但 #13 却不起作用?

我们将不胜感激。

编辑 好吧,我尝试了更大的数字,但我遇到了同样的问题,但是例如,如果我将 UPDATE_SERVICES_OPERATION 数字与另一个操作数字切换,它现在执行 UPDATE_SERVICES_OPERATION 但它不会执行我切换数字的操作。那么为什么它不能与较新的数字一起使用:S,或者它只是 xcode 上的构建问题? (我会重启并更新)

最佳答案

你不应该像你在这里做的那样直接比较一个 NSNumber 因为它是一个对象而不是一个简单的类型。您当前的代码取决于对象内存地址的相等性而不是它们的值。阅读此处了解更多信息 Comparing objects in 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
    }

}

关于Iphone sdk - 比较 NSNumber 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10452794/

相关文章:

ios - xCode 相同的应用程序自动不同的WS

ios - 如何在 iOS 中平滑地放大和缩小 UIButton

android - 下拉菜单中的 Ancher 字体大小在移动浏览器中发生变化

iphone - 使启动图像显示更长的xcode

ios - 我如何测试为什么该对象在没有返回时返回零?

ios - iOS (iPhone/iPad) 中的串行或 HID (usb) 通信

ios - AFNetworking 从错误端点获取响应 JSON

ios - Web View 为构建的应用程序加载页面,但不测试飞行部署的版本

iphone - 将数组排序到字典中

iphone - 如何使用准确的框架和展示位置 ID 启动 revmob 横幅广告?