9

Mike Ashのブログ投稿によると、ポインターがBOOLよりも大きいため、BOOLへのキャストは6%の確率で失敗する可能性があります。このため、オブジェクトが存在するかどうかを確認する場合は、nilに対して確認することをお勧めします。

if (self != nil) {

Appleテンプレートが行うことの代わりに

if (self) {

Appleのテンプレートにはバグが含まれていますか、それとも私が知らない他の構文上の砂糖がありますか?

4

4 に答える 4

12

彼らはBOOLにキャストしたので

いいえ、ありません。キャストは一切行われません。ただし、式は論理値として評価されます。ポインター(nilおよびselfである)の場合、NULLポインターはfalseと評価され、それ以外はtrueと評価されます。これはバグではなく、簡単な方法であり、完全に有効なCです。

NULLまたは:に対して明示的な比較を実行する理由についてはnil、場合によっては、特に式がどのタイプおよび範囲であるかが一見して明らかでない場合は、より読みやすくなる可能性があります。ただし、Objective-CとCocoaでは、これを行うのはコンストラクターの一般的なイディオムであるため、経験豊富なプログラマーなら誰でも問題なく理解できます。

于 2012-12-17T14:41:43.900 に答える
4

Objective-CはCに基づいており、Cでは、ifステートメントは、おそらく驚くべきことに、ブール値では機能しません。

Cにはタイプの階層があります。

  • charinteger、およびenumeration(enum)型は整数型です
  • 、、floatおよびは実際doubleフローティングタイプですlong double
  • 3つの複素数タイプがあり、実際の浮動小数点タイプと合わせて、単に浮動小数点タイプと呼ばれます。
  • 整数型と浮動小数点型を組み合わせて算術型を形成します
  • 算術型とポインタ型はスカラー型を形成します

ふぅ!

さて、if声明では、それは次の形式の1つです。

if ( expression ) statement
if ( expression ) statement else statement

ここで、式は任意のスカラー型でなければなりません。最初の(または唯一の)ステートメントは、式が0と等しくない場合に実行され、2番目の(存在する場合)ステートメントは、式が0と等しい場合に実行されます。

それで:

if (self) ...

if (self != nil) ...

結果は同じです。

最初の式selfは、スカラー型であるポインター型であり、ポインター型のゼロ(コードでは)と等しくないかどうかが比較されますnil。2番目の式self != nil等式式0であり、または1型のいずれかを生成しますint。これもスカラー型です...

したがって、技術的には、2番目の形式には値の中間生成が含まれintますが、実際に値を生成するコンパイラはありません(もちろん、式の結果を変数に割り当てない限り)。

ノート:

  1. やや奇妙なif ( sin( angle ) ) ...ことに有効です...
  2. switchステートメントは、スカラーではなく整数型で動作します

HTH

于 2012-12-17T17:40:17.623 に答える
3

いいえ、ポインタがnilでなければ失敗することはありません。安全であり、唯一の違いは構文です。同じであるため、どちらの方法もお勧めしません。あなたは自分自身をBOOLにキャストしているのではなく、自分自身がゼロと異なるかどうかをチェックしているだけです。

于 2012-12-17T14:43:33.140 に答える
2

編集
マーティンのコメントによると、私は間違ったデバッグメッセージをログに記録していました。それは同じだ

これが簡単なテストです

NSString *str = nil;
// suppose our string points to a string object whose starting address is 0x4500
//I'm assigning it manually so that I can test
str = 0x4500;
NSLog(@"%d",str);
if (str) {
    NSLog(@"It's non-nil");
}
else {
    NSLog(@"It's nil");
}

if (str == nil) {
    NSLog(@"It's nil");
}
else {
    NSLog(@"It's non-nil");
}

出力は:

It's non-nil
It's non-nil
于 2012-12-17T15:17:56.217 に答える