これ:
NSString *user_id = [standardUserDefaults objectForKey:@"user_id"];
文字列ではなくNSNumber
(NSCFBoolean
のプライベートサブクラスとして)を返しています。NSNumber
したがって、は実装されずlength
、例外が発生します。
おそらくあなたはテストしたい[user_id intValue] > 0
ですか?文字列に変換しても、常にある程度の長さがあります。
(提起された副次的な問題:単にuser_id
aへの参照として宣言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];
}
}