Mike Ashのブログ投稿によると、ポインターがBOOLよりも大きいため、BOOLへのキャストは6%の確率で失敗する可能性があります。このため、オブジェクトが存在するかどうかを確認する場合は、nilに対して確認することをお勧めします。
if (self != nil) {
Appleテンプレートが行うことの代わりに
if (self) {
Appleのテンプレートにはバグが含まれていますか、それとも私が知らない他の構文上の砂糖がありますか?
Mike Ashのブログ投稿によると、ポインターがBOOLよりも大きいため、BOOLへのキャストは6%の確率で失敗する可能性があります。このため、オブジェクトが存在するかどうかを確認する場合は、nilに対して確認することをお勧めします。
if (self != nil) {
Appleテンプレートが行うことの代わりに
if (self) {
Appleのテンプレートにはバグが含まれていますか、それとも私が知らない他の構文上の砂糖がありますか?
彼らはBOOLにキャストしたので
いいえ、ありません。キャストは一切行われません。ただし、式は論理値として評価されます。ポインター(nil
およびself
である)の場合、NULL
ポインターはfalseと評価され、それ以外はtrueと評価されます。これはバグではなく、簡単な方法であり、完全に有効なCです。
NULL
または:に対して明示的な比較を実行する理由についてはnil
、場合によっては、特に式がどのタイプおよび範囲であるかが一見して明らかでない場合は、より読みやすくなる可能性があります。ただし、Objective-CとCocoaでは、これを行うのはコンストラクターの一般的なイディオムであるため、経験豊富なプログラマーなら誰でも問題なく理解できます。
Objective-CはCに基づいており、Cでは、if
ステートメントは、おそらく驚くべきことに、ブール値では機能しません。
Cにはタイプの階層があります。
char
integer、およびenumeration(enum
)型は整数型ですfloat
およびは実際double
のフローティングタイプですlong double
ふぅ!
さて、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
ますが、実際に値を生成するコンパイラはありません(もちろん、式の結果を変数に割り当てない限り)。
ノート:
if ( sin( angle ) ) ...
ことに有効です...switch
ステートメントは、スカラー型ではなく整数型で動作しますHTH
いいえ、ポインタがnilでなければ失敗することはありません。安全であり、唯一の違いは構文です。同じであるため、どちらの方法もお勧めしません。あなたは自分自身をBOOLにキャストしているのではなく、自分自身がゼロと異なるかどうかをチェックしているだけです。
編集
マーティンのコメントによると、私は間違ったデバッグメッセージをログに記録していました。それは同じだ
これが簡単なテストです
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