2012-05-04 6 views
2

私はいくつかのネットワーク操作を行うプロジェクトを持っています。容易な制御のために私は、私はオブジェクトや配列を使用して操作を実行する必要があり、この方法が容易であるためのNSNumberとして定義され、各操作に一意のIDを与えている:Iphone sdk - 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)を加え、全ての==操作はちょうどその数と!私は値がOKであることを保証するためにデバッガを使用していたが、私はできるだけで、偽の結果私が使用する場合、条件を真にする:[opId isEqualToNumber:UPDATE_SERVICES_OPERATION]かなり長いです。

私はNSNumberがオブジェクトであることを知っていますので、==は最善の選択肢ではないかもしれませんが、なぜプロジェクト間の他のすべての操作でも動作しますが、#13は動作しません。

ご協力いただければ幸いです。

編集 さて、私は大きな数字にしようと、私は同じ問題を抱えているが、私は別のOP番号にtheUPDATE_SERVICES_OPERATION番号を切り替えた場合、たとえば、それは今UPDATE_SERVICES_OPERATIONを行いますが、それは文句を言わない私が数を切り替える操作を行います。それではなぜ新しい番号で動作しないのですか?それとも、xcodeのビルド上の問題ですか? (私は再起動して更新します)

答えて

11

NSNumberは、オブジェクトであり単純なタイプではないので、ここで比較してはいけません。あなたの現在のコードは、オブジェクトのメモリアドレスがそれらの値ではないかどうかによって異なります。詳細はComparing objects in Obj-Cをご覧ください。

==を使用してオブジェクトの等価性を比較するのではなく、isEqual:関数をNSObjectに置き換えてください。通常、比較するオブジェクトが同じインスタンスであることを確認したい場合にのみ使用してください。以下のコードはあなたの問題を解決するはずです。


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

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

} 
+0

私は同意します、これはどのように行うべきかです。しかし、私にとって問題はまだ開いています...なぜ行動は変わるのですか?私は自分自身でそれを理解しようとしましたが、まだ手がかりを得ていません。 –

+0

@ C4 - Travisこの質問への回答を読んでいるのなら、http://stackoverflow.com/questions/5054730/comparing-objects-in-obj-cに掲載されているコードは、オブジェクト。他の値がうまくいく理由はたくさんありますが、最後はそうではありませんが、すべてが矛盾している可能性があります。さらに分析するためには、コードベース全体が必要になります。 –

+0

cool、thanks dave –

関連する問題