私は(BOOL
にキャスト)同じことを行うと考えているこれらの2つの方法の違いは何ですか:BOOLへのキャストとboolValueメッセージの送信の違いは何ですか?
BOOL boolOne = (BOOL) [dictionary objectForKey:@"boolValue"];
BOOL boolTwo = [[dictionary objectForKey:@"boolValue"] boolValue];
いずれかの他の上で使用されなければならない場合には?
私は(BOOL
にキャスト)同じことを行うと考えているこれらの2つの方法の違いは何ですか:BOOLへのキャストとboolValueメッセージの送信の違いは何ですか?
BOOL boolOne = (BOOL) [dictionary objectForKey:@"boolValue"];
BOOL boolTwo = [[dictionary objectForKey:@"boolValue"] boolValue];
いずれかの他の上で使用されなければならない場合には?
これらはかなり異なっています。
最初にオブジェクトポインタを辞書から取得し、ポインタをBOOL
として解釈します。これは、任意の非nil
ポインタYES
、及びNO
としてnil
として解釈されることを意味します。具体的な例では、ディクショナリにはnil
ポインタを含めることができないため、このコード行からはYES
しか取得できません。
もう一つは、そのオブジェクトにメッセージboolValue
を送信し、辞書から同一のオブジェクトを取ります。恐らく、オブジェクトがメッセージを認識すると、そのオブジェクトのバージョンはBOOL
になります。
辞書キー@"boolValue"
と関連NSNumber
が含まれている場合、具体的な例として、そうでなければNO
、NSNumber
メッセージboolValue
を受け取り、それが非ゼロ復帰YES
である場合。
だからあなたの質問に答えるために、あなたは二番目の形式を使用する必要があります。 BOOL
へのポインタをキャストすることはめったに意味がありません。
いいえ、それらは同じではありません。違いは、2番目は正しいもの、1番目は正しくないということです。あなたの第1ラインで
あなたは単にポインタがnilであるか、実際のオブジェクトに格納されている値とは何の関係も持っていないかどうかのチェックとほぼ同等であるBOOLへのポインタをキャスト。
[[dictionary objectForKey:@"boolValue"] boolValue];
はキャストではありませんが、NSNumberのメソッドを呼び出してboolを返します。キャスト内は関与している可能性がありますが、実装の詳細は公開されていません。