NSString
がNULL
、nil
などであるかどうかを検出するコードがありますが、クラッシュします。ここに私のコードがあります:
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
'
私は何か間違っていますか?別の方法で行う必要がありますか?
Objective-Cオブジェクト(タイプNULL
)のid
値はnil
です。
NULL
はCポインタに使用されます(タイプvoid *
)。
(結局、両方とも同じ値(0x0
)を保持することになります。ただし、タイプは異なります。)
Objective-C:
nil
(すべて小文字)は、Objective-Cオブジェクトへのヌルポインターです。Nil
(大文字)は、Objective-Cクラスへのヌルポインターです。NULL
(すべて大文字)は、他のものへのNULLポインターです(C pointers、つまり)。[NSNull null]
は、singletonです。nilの使用が不可能な場合(nilの追加/受信NSArray
sへ/から例)Objective-C++:
null
(小文字)またはnullptr
(C++ 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]]) ...
後者(メッセージ呼び出しを使用)は、false
がgetCaption
である場合にnil
を返すことに注意してください。欲しいです。
したがって、(何らかの理由で)の両方をチェックする必要がある場合nil
/NULL
NSNull
、次の2つのチェックを組み合わせる必要があります。
if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...
同等のポジティブチェックの作成に関するヘルプについては、 De Morganの法則 および ブール否定 を参照してください。
Edit:NSHipster.com nil、nullなどの微妙な違いに関する素晴らしい記事を公開しました。
あなたが使用する必要があります
if ([myNSString isEqual:[NSNull null]])
これにより、オブジェクトmyNSStringがNSNullオブジェクトと等しいかどうかが確認されます。
NSNULL
を確認する好ましい方法は
if(!getCaption || [getCaption isKindOfClass:[NSNull class]])
if([getCaption class] == [NSNull class])
...
あなたもできる
if([getCaption isKindOfClass:[NSNull class]])
...
nSNullの新しいサブクラスに対する将来の証明になりたい場合。
このコードで確認してください:
NSString *object;
if(object == nil)
これは動作するはずです。