7

Objective-C でコンパイラをサポートする NSNumber リテラルができたので、NSNumber を既知の整数値と比較するための好ましい方法はありますか?

古いやり方は [myNumber integerValue] == 5

[myNumber isEqualToNumber:@5]これで、 または も実行できます[myNumber isEqualToNumber:@(someVariable)]

メソッドに利点はありますisEqualToNumber:か、または比較する値が既に NSNumber でない限り、integerValue を使用する必要がありますか?

私が見ることができる利点の 1 つは、someVariable が NSInteger から CGFloat に変更された場合、新しい方法でコードを変更する必要がないことです。

4

4 に答える 4

11

新しい方法は、実際には古いものの周りの新しい構文です

[myNumber isEqualToNumber:[NSNumber numberWithInt:5]]

numberWithInt:これには、 ;の追加の呼び出しが必要です。基本的に、単一のディスパッチとゼロ割り当てのソリューションを、2つのディスパッチと、場合によっては割り当て/割り当て解除のソリューションと比較しています。

タイトなループの外でこの比較を行う場合、それは問題ではありません。しかし、おそらく何かを描いているときに、非常にタイトなループでそれを行うと、速度が低下する場合があります。だから私は古い方法を使い続けるでしょう

[myNumber integerValue] == 5
于 2013-02-14T20:13:30.493 に答える
3

「古い方法」は、1 つのメソッド呼び出しと、2 つの基本型に対する比較演算子です。

「新しい方法」は、1 つのメソッド呼び出しと追加のオブジェクト作成です。

したがって、古い方法の方が効率的です。ただし、これが高性能ループ (または同様のもの) で行われない限り、違いはごくわずかです。

あなたが述べたように、新しい方法は、特定の種類の数値に関してより柔軟になる可能性があります。

個人的には、対処すべき明確で具体的なパフォーマンスの問題がない限り、より読みやすく保守しやすい形式を選択します。

元の値に関係なく、浮動小数点値または整数値を比較する特定の理由がある場合があります。この場合、比較の種類が明確であるため、古い方法の方が優れています。

于 2013-02-14T20:13:50.287 に答える
3

短い答え: [myNumber integerValue] == 5それでも最高です。

長い (しかし、おそらく気にする必要はない) 回答: iOS 5 を開始すると、「一部の」 NSNumbers はタグ付きポインター (クイック google ) を使用して実装されます。つまり、NSNumber 値が 24 ビットに収まる限り (iPhone/iPad の 32 ビット ARM プロセッサの場合)、実際のインスタンスは作成されません。したがって、理論的には、値が 24 ビットをオーバーフローしないことが確実な場合は、実際にはmyNumber == @5.

これは本当に良いアドバイスではありません。に固執し[myNumber integerValue] == 5ます。タグ付きポインターは、プログラマーではなくランタイムを支援するためにあります。

于 2013-02-15T00:49:04.010 に答える