0

私はこのようなことをしています:

// GET THE USER ID
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *user_id = [standardUserDefaults objectForKey:@"user_id"]; 

次に、user_idが空かどうかを確認します

if ([user_id length] == 0) {
  proceed = false;
  NSLog(@"Error: User id is not set.");
}

そして、私はこのランタイム例外を受け取ります:

*キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了しています、理由:'-[__ NSCFBoolean length]:認識されないセレクターがインスタンス0x1469f70に送信されました'

なぜ例外が発生するのか考えてみてください。自分のやっていることには何も悪いことはないと思いました。

ありがとう!

4

2 に答える 2

5

これ:

NSString *user_id = [standardUserDefaults objectForKey:@"user_id"];

文字列ではなくNSNumberNSCFBooleanのプライベートサブクラスとして)を返しています。NSNumberしたがって、は実装されずlength、例外が発生します。

おそらくあなたはテストしたい[user_id intValue] > 0ですか?文字列に変換しても、常にある程度の長さがあります。

(提起された副次的な問題:単にuser_idaへの参照として宣言NSStringすることは、それに割り当てたものが魔法のように文字列になることを意味するわけではありません。実際、型オブジェクト型の強制効果はまったくありませんNSUserDefaults。タイプid、つまり、オブジェクトであることを保証しますが、タイプについては主張せず、コンパイラも認識しません。すべてのオブジェクトはid、警告を生成せずにキャストしたり、キャストしたりできるため、次のようなクラスで使用できます。ユーザーのデフォルト、NSArrayなど。オブジェクトである限り、何でも受け入れることができます)。

編集:コメントで提起された問題に基づいて、最初に保存されたものは文字列ではない可能性があるようです。Webのものを検証する良い方法は、おそらく次のようなものです。

// fall through here if the object isn't a string
if(![responseString isKindOfClass:[NSString class]])
{
    // check whether it's something that can be converted to a string
    if(![responseString respondsToSelector:@selector(stringValue)])
    {
        // some sort of error condition; the server returned something
        // that isn't a string and doesn't convert (in and of itself) to string
    }
    else
    {
        // convert the object to a string
        responseString = [responseString stringValue];
    }
}
于 2012-07-26T17:06:47.663 に答える
1

このエラーが発生する理由は、ブール値のように見えるもので「長さ」を呼び出そうとしているためです。いずれにせよ、文字列が空白かどうかを確認するために、カテゴリを使用してNSStringクラスに追加できる簡単なメソッドをいくつか示します。

    -(BOOL)isBlank{
        return [[self trim] length]==0;
    }
    -(NSString *)trim{
        return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
    }

それからそれを呼ぶためにそれはただです:

    [myString isBlank];
于 2012-07-26T17:05:36.353 に答える