2

いくつかのネットワーク操作を行うプロジェクトがあります。簡単に制御するために、各操作に NSNumber として定義された一意の Id を与えました。これは、オブジェクトと配列を使用して操作を実行する必要があり、この方法の方が簡単だからです。

#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 です。その番号だけで! use: [opId isEqualToNumber: UPDATE_SERVICES_OPERATION]これはかなり長いです。

NSNumber はオブジェクトであるため、== が最良の選択肢ではない可能性があることは理解していますが、プロジェクト内の他のすべての操作では機能するのに、#13 では機能しないのはなぜですか?

どんな助けでも大歓迎です。

編集 さて、私はより大きな数で試してみましたが、同じ問題がありますが、たとえば、UPDATE_SERVICES_OPERATION 番号を別の op 番号に切り替えると、UPDATE_SERVICES_OPERATION が実行されますが、番号を切り替えた操作は実行されません。では、なぜ新しい番号で動作しないのでしょうか :S、または単に xcode のビルドの問題なのでしょうか? (再起動して更新します)

4

1 に答える 1

11

NSNumberこれは単純な型ではなくオブジェクトであるため、ここで行っているように直接比較しないでください。現在のコードは、値ではなくオブジェクトのメモリ アドレスの等価性に依存しています。Obj-C でのオブジェクトの比較について詳しくは、こちらをお読みください。

オブジェクトの等価性を比較するために == を使用するべきではありません。代わりにisEqual:関数 on NSObjectand を使用するのは、通常、比較するオブジェクトが同じインスタンスであることを確認したい場合のみです。以下のコードで問題が解決するはずです。


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

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

}
于 2012-05-04T16:49:22.333 に答える