1

次のコードがあります。

NSString *content = [[NSUserDefaults standardUserDefaults] stringForKey:@"mykey"];
NSLog(@"string is %@",content);
if ([content stringIsEmpty]){
   NSLog(@"empty string");
}else{
  NSLog(@"string is not empty");
}

stringIsEmpty は のクラス カテゴリNSStringです:

- (BOOL ) stringIsEmpty {
    if ((NSNull *) self == [NSNull null]) {
        return YES;
    }
    if (self == nil) {
        return YES;
    } else if ([self length] == 0) {
        return YES;
    }
    return NO;
}

出力は次のとおりです。

string is (null)
string is not empty

同時に空ではなく、null である可能性はありますか?

4

3 に答える 3

3

何が起こるかというと:

[content stringIsEmpty:YES]

が の場合、 false ( NO)を返しcontentますnil。したがって、あなたのコードは

 NSLog(@"string is not empty");

ブランチ。これはより良いでしょう:

if (content && [content stringIsEmpty:YES]){
    ...

これを行うより良い方法は、メソッドのセマンティクスを逆にすることです。

if ([content stringIsNotEmpty]) {

いつ返さcontentれるか、そうでないときにメソッドが実行されるため、これはうまく機能します。nilNOnil

編集:

Objective-C では、 にメッセージを送信することnilは正当であり、定義により は に評価されnilます。「nil にメッセージを送信する目的 c」の Google。

別の言語 (C++) では、コードがクラッシュします (実際には未定義の動作ですが、簡単にするためです)。

于 2013-01-27T11:00:06.347 に答える
1

小さな関数を使用して空であることをテストします。文字列だけでなく、次のように機能します。

static inline BOOL isEmpty(id thing) {
    return thing == nil
        || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
        || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}

私は通常、それを自分の pch ファイルにインポートします - 帰属とともに見ることができます: https://gist.github.com/325926

@sergioがすでに指摘しているように-文字列がnilnilであることをテストするメッセージを送信できない場合-nilにメッセージを送信すると、voidメソッドに対しては何も行われず、メソッドが何かを返す場所ではnilが返されます。

また

パラメータを使用してメソッドを呼び出しています

if ([content stringIsEmpty:YES])

しかし、あなたのメソッド宣言はそれを取りません:

- (BOOL ) stringIsEmpty {

それは一体何ですか?

于 2013-01-27T11:06:49.603 に答える
0

メソッドの外側で 'content == nil' ケースをチェックする必要があります。

1 つのメソッドだけを呼び出せるようにする場合は、メソッドを "stringHasContent" などの陽性をテストするものに変更し、YESifを返しますself.length > 0

于 2013-01-27T11:50:11.147 に答える