55

aNSStringNULLnilなどであるかどうかを検出するコードがありますが、クラッシュします。これが私のコードです:

NSArray *resultstwo = [database executeQuery:@"SELECT * FROM processes WHERE ready='yes' LIMIT 0,1"];
for (NSDictionary *rowtwo in resultstwo) {

NSString *getCaption = [rowtwo valueForKey:@"caption"];

if (getCaption == NULL) {
theCaption = @"Photo uploaded...";
} else if (getCaption == nil) {
theCaption = @"Photo uploaded...";
} else if ([getCaption isEqualToString:@""]) {
theCaption = @"Photo uploaded...";
} else if ([getCaption isEqualToString:@" "]) {
theCaption = @"Photo uploaded...";
}

}

そして、ここにエラーがあります:

キャッチされていない例外 ' NSInvalidArgumentException' が原因でアプリを終了しています。理由: ' -[NSNull isEqualToString:]: 認識されないセレクターがインスタンス0x3eba63d4'に送信されました

私は何か間違ったことをしていますか?別の方法で行う必要がありますか?

4

5 に答える 5

172

Objective-C オブジェクト(タイプ)のNULL値は です。idnil

WhileNULLC ポインター(タイプvoid *) に使用されます。

(結局、どちらも同じ値 ( 0x0) を保持することになります。ただし、型は異なります。)

Objective -C の場合:

  • nil (すべて小文字)は、 Objective-C オブジェクトへの null ポインターです。
  • Nil (大文字)は、 Objective-C クラスへの null ポインターです。
  • NULL (すべて大文字)は、他のものへの null ポインターです( C ポインター、つまり)
  • [NSNull null]nil を使用できない状況用のシングルトンです (たとえば、 sに nil を追加/受信する)NSArray

Objective -C++ の場合:

  • 上記のすべてに加えて:
  • null (小文字)またはnullptr( C++11以降) は、C++ オブジェクトへの null ポインターです。

したがって、チェックするには、明示的に(またはそれぞれ)nil比較する必要があります。nilNULL

if (getCaption == nil) ...

または、ObjC / C暗黙的に実行させます。

if (!getCaption) ...

これは、 Cのすべての式(およびそのスーパーセットであるObjective-Cを使用) が暗黙のブール値を持っているため機能します。

expression != 0x0 => true
expression == 0x0 => false

これをチェックすると、 のシングルトン インスタンスへのポインターが返され、 ではなく、 と等しくないためNSNull、明らかに機能しません。[NSNull null]NSNullnil0x0

したがって、次のNSNullいずれかを使用して確認できます。

if ((NSNull *)getCaption == [NSNull null]) ...

または(推奨、コメントを参照):

if ([getCaption isKindOfClass:[NSNull class]]) ...

後者 (メッセージ呼び出しを利用) はfalsegetCaptionたまたまが返されるnilことに注意してください。

したがって、(何らかの理由で) /の両方をチェックする 必要がある場合は、これら 2 つのチェックを組み合わせる必要があります。nilNULL NSNull

if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...

同等の正のチェックを作成する方法については、ド モルガンの法則ブール否定を参照してください。

編集: NSHipster.comは、nil、null などの微妙な違いに関する素晴らしい記事を公開しました。

于 2011-04-16T02:44:34.853 に答える
24

使用する必要があります

if ([myNSString isEqual:[NSNull null]])

これにより、オブジェクト myNSString が NSNull オブジェクトと等しいかどうかがチェックされます。

于 2011-04-16T02:46:59.393 に答える
2
if([getCaption class] == [NSNull class])
    ...

あなたもできる

if([getCaption isKindOfClass:[NSNull class]])
    ...

NSNull の新しいサブクラスに対する将来の証拠になりたい場合。

于 2012-02-29T01:08:13.560 に答える