web-dev-qa-db-ja.com

NSStringがnullかどうかを検出する方法は?

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

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 '

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

54
iosfreak

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

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

(結局、両方とも同じ値(0x0)を保持することになります。ただし、タイプは異なります。)

Objective-C

  • nil(すべて小文字)は、Objective-Cオブジェクトへのヌルポインターです。
  • Nil(大文字)は、Objective-Cクラスへのヌルポインターです。
  • NULL(すべて大文字)は、他のものへのNULLポインターですC pointers、つまり)
  • [NSNull null]は、singletonです。nilの使用が不可能な場合(nilの追加/受信NSArraysへ/から例)

Objective-C++

  • 上記のすべて、さらに:
  • null(小文字)またはnullptrC++ 11以降)はC++ objectsへのヌルポインター。

したがって、nilに対してチェックするには、nil(またはNULLに対して)explicitlyと比較する必要があります。

if (getCaption == nil) ...

またはObjC/[〜#〜] c [〜#〜]やる暗黙的に

if (!getCaption) ...

これは、[〜#〜] c [〜#〜](およびObjective-Cそのスーパーセットである)暗黙的なブール値を持っています:

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

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

したがって、NSNullに対してチェックするには、次のいずれかを使用できます。

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

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

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

後者(メッセージ呼び出しを使用)は、falsegetCaptionである場合にnilを返すことに注意してください。欲しいです。

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

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

同等のポジティブチェックの作成に関するヘルプについては、 De Morganの法則 および ブール否定 を参照してください。

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

168
Regexident

あなたが使用する必要があります

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

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

24
ludesign

NSNULLを確認する好ましい方法は

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

あなたもできる

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

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

2
Dustin

このコードで確認してください:

NSString *object;

if(object == nil)

これは動作するはずです。

2
Surjeet Rajput