以下は、辞書がnullであるかどうかをテストし、nullでない場合は、正しいオブジェクトを引き出すことになっているコードブロックです。ただし、何らかの理由で、if
チェックが失敗したにもかかわらず、コードは実行されます。 NSNull
がどのように機能するかについて、私にはわからない癖がありますか、それともAppleバグですか?
if (svcUser && !(svcUser == (id)[NSNull null])) {
return [svcUser objectForKey:@"access_level"];
}
コンソールの応答:
(lldb) print svcUser && !(svcUser == (id)[NSNull null])
(bool) $0 = false
(lldb) continue
-[NSNull objectForKey:]: unrecognized selector sent to instance 0x2b51678
NSNull
はクラスです。また、すべてのクラスと同様に、2つのオブジェクトが同じ値を表すかどうかを確認するには、isEqual:
ではなく==
を使用する必要があります。
if (svcUser && ![svcUser isEqual:[NSNull null]]) {
return [svcUser objectForKey:@"access_level"];
}
以下を使用して確認できます。
if(![svcUser isKindOfClass:[NSNull class]]){
return [svcUser objectForKey:@"access_level"];
}
@ JE42のアプローチを使用すると、Xcode5.1の時点で警告が表示されます。代わりにそれをキャストします:
(id)svcUser == [NSNull null]