2012-07-26 62 views
0

我做這樣的事情:iOS版 - 異常檢查時,如果字符串爲空

// 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'

任何想法,爲什麼我得到異常?我不認爲我所做的事情有什麼不妥。

謝謝!

回答

5

這:

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

將返回一個NSNumber(如NSCFBooleanNSNumber私有子類),而不是一個字符串。因此它不執行length,導致異常。

也許你想測試[user_id intValue] > 0?即使你把它轉換成一個字符串,它也會有一定的長度。

(枝節問題提出:僅僅聲明user_id作爲參考的NSString並不意味着任何你分配給它奇蹟般地成爲一個字符串;的確存在類型對象的類型強制任何影響編譯器不因爲NSUserDefaults會返回id類型的對象,即它保證它們是對象,但不會聲明它們的類型,編譯器也不知道。所有對象都可以在id之間產生或不產生警告。它可以被諸如用戶默認值,NSArray等的類使用,只要它是一個對象,它們就可以接受任何東西)。

編輯:基於在評論中提出的問題,這聽起來像最初被存儲可能不是一個字符串的東西。驗證網絡資料的一個好方法可能是這樣的:

// 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]; 
    } 
} 
+1

實際上我想獲得實際的user_id值,這是我放在那裏的字符串值。從standardUserDefaults獲取該字符串的正確方法是什麼?謝謝! – GeekedOut 2012-07-26 17:09:47

+0

我們怎麼能這麼肯定'user_id'是NSString的類型的呢?它可能是一個字母數字或數字字符串。 – samfisher 2012-07-26 17:10:25

+1

@GeekedOut如果用戶默認的存儲號碼,您必須存儲的號碼。它不會更改類型。只是爲了確認:'user_id'是真正的局部變量 - 這不只是你張貼的問題是,它使一個快速編輯?嘗試添加'NSLog(@「%@」,[user_id class])或'if([user_id isKindOfClass:[NSNumber class]])NSLog(@「是number」)'來說服自己。 @samfisher引發的異常表明'length'被髮送到的對象的類型是'NSCFBoolean',並且這是'NSNumber'的一個私有子類(後者在實踐中是一個集羣)。 – Tommy 2012-07-26 17:12:19

1

你得到這個錯誤的原因是您要呼籲這似乎是一個布爾值,「長度」。無論哪種方式,用於檢查一個字符串是否是空白這裏有一些簡單的方法,你可以通過一個類別的方式添加到NSString類:

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

然後調用它,它只是:

[myString isBlank];