web-dev-qa-db-ja.com

NSNullとの同等性のテスト

以下は、辞書が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
14
jungziege

以下を確認してください。

svcUser == [NSNull null]

これは、Appleが docs で言及しているアプローチです。

30
JE42

NSNullはクラスです。また、すべてのクラスと同様に、2つのオブジェクトが同じ値を表すかどうかを確認するには、isEqual:ではなく==を使用する必要があります。

if (svcUser && ![svcUser isEqual:[NSNull null]]) {
    return [svcUser objectForKey:@"access_level"];
}
18
rmaddy

以下を使用して確認できます。

 if(![svcUser isKindOfClass:[NSNull class]]){
    return [svcUser objectForKey:@"access_level"];
}
8
Joshua

@ JE42のアプローチを使用すると、Xcode5.1の時点で警告が表示されます。代わりにそれをキャストします:

(id)svcUser == [NSNull null]
8
Liron Yahdav