2012-03-23 5 views
2

特定のシナリオで比較する定数のint値を格納しようとしています。私のこのようなルックス定義:NSNumberの値と定義済みのintとの比較

#define kApiSuccessCode 0 

をそして私はBOOL結果を与えるこれをからstatusCode(NSNumber)を比較する方法があります:

- (BOOL)isSuccess { 
    return [self.statusCode isEqualToNumber:[NSNumber numberWithInt:kApiSuccessCode]]; 
} 

私はこのように合成NSNumberプロパティがあります。

@property (nonatomic, strong) NSNumber *statusCode; 

問題が発生しました。実行が中断されました。理由:EXC_BAD_ACCESSこのコードを実行するとエラーが発生します。なぜ?これはint値を比較する悪い方法ですか?おかげで解決しよう

は、私がNSLogBOOL値すなわちNSLog(@"Does this work? %@", [response isSuccess])をしようとする基本的なミスを作っていたが判明します。つまり、コード自体は機能しますが、これをより効率的にするための提案について皆様に感謝しています。

+2

これを理解したら、代わりにこれをお勧めします: 'return [self.statusCode intValue] == kApiSuccessCode; – lnafziger

答えて

2

this postの指示に従ってゾンビを有効にします。

これは、変数の割り付け解除されたインスタンスにメッセージを送信するかどうかを知らせます。

あなたがこれを理解したら、私は、代わりにこのことをお勧めします:

- (BOOL)isSuccess { 
    return [self.statusCode intValue] == kApiSuccessCode; 
} 
0

Advantage and disadvantages of #define vs. constants?

As mentioned by others, #define doesn't have a type associated with it

=> kApiSuccessCodeが整数でない、事前コンパイラはただでそれを置き換えますプログラムをコンパイルする前に0

+0

はい、kApiSuccessCodeは0に置き換えられますが、上記のコンテキストでは整数になります。 –

4

クラッシュがなぜ発生しているのか分かりませんが、他の質問に答えるためには、これはint値を比較するうえで最適な方法ではありません。

NSNumberインスタンスに値を格納する正当な理由がありますが、ほとんどの場合は過剰です。実際にNSNumberインスタンスを持っている場合は、intValueを使用して整数値を取得し、完全な新しいインスタンスを作成するのではなく、プリミティブと比較してください。

ファンデーションクラスを見ると、多くの場合、インスタンスの代わりにNSIntegerプリミティブタイプが使用されています。たとえば、NSURLResponseクラスはNSIntegerを使用してHTTPステータスコードを返します。

関連する問題