2011-10-15 47 views
2

我有,我要確保我做一些特別的東西,當我遇到一個「空」的字符串的方法。它的工作原理偉大的,當它實際上有一個字符串,或者當我特地將它設置爲「無」或「NULL」,但是當我嘗試測試未初始化的NSString它崩潰。我如何處理這種情況?檢查「空」的NSString崩潰時的NSString未初始化

例如:

-(void) WhyDoICrash 
{ 
    NSString *foo; 

    // Some other stuff... 

    // foo should be considered "empty" 
    if (foo == nil || foo == NULL || [foo length] == 0) 
    { 
    // whatever 
    } 
} 

============= EDIT ===================

好的,上述僅僅是一個非常簡單的示例顯示的問題。實際上,我使用的NSString,類別,這意味着一些我越來越無法使用的(好,但不適用)的建議。以下是我的確切代碼:

#pragma mark - NSString Category 

@interface NSString (NullOrEmptyTesting) 
+(BOOL) isNullOrEmpty: (NSString*)input; 
@end 

@implementation NSString (NullOrEmptyTesting) 

+(BOOL) isNullOrEmpty: (NSString*)input 
{ 
    return (input == (id)[NSNull null] || input.length == 0); 
} 

@end 

回答

5

(...),但它崩潰時,我嘗試測試未初始化的NSString。我如何處理這種情況?

您可以通過初始化相應的變量來處理它,例如,

NSString *foo = nil; 

在C和Objective-C,automatic variables沒有初始化爲0 - 你不能對包含在變量值的任何假設。看到這個問題:What happens to a declared, uninitialized variable in C? Does it have a value?

此外,

if (foo == nil || foo == NULL || [foo length] == 0) 

等同於:

if (foo == nil || [foo length] == 0) 

,而且由於Objective-C supports messaging nil objects,這是常見的測試:

if ([foo length] == 0) 

請注意Objective-C雖然在分配實例時初始化實例變量爲0。

+0

我同意你的意見。我的真實場景實際上是一種將字符串作爲參數的方法。我只是想給出一個非常簡單的代碼示例來說明問題。 :-) – ghostatron

+0

@con那麼方法的參數是什麼?如果它來自一個未初始化的自動變量,那麼它是相同的推理:你不能對它的值做任何假設。 – 2011-10-15 01:21:20

+0

我剛剛編輯原始帖子以提供確切的代碼。我將一個類別添加到NSString中,如果我使用未初始化變量的方法,它會崩潰。 -.- – ghostatron

0

如果您正在進行AND比較,則不會崩潰。

if ((foo != nil) && (foo != NULL) && ([foo length] > 0)) 
{ 
    // do something 
} 

你崩潰的原因是,或比較你正在做評估的一切(包括[富長度],每次)。在這種情況下,您正在向無效對象發送消息,因此發生崩潰。

在做的和比較。一個成功的「富== NULL」測試將停止評估一切(這樣你就不會進入 - 和崩潰 - [富長度])

+0

它確實仍然崩潰(使用最新的xCode 4.2和sdk 5)。這不是承認FOO作爲零或空,因此被評價[富長度]部分。 – ghostatron

+0

作爲一個方面說明,我一直認爲,一旦它確定「IF」陳述是真或假,c總會短路。所以就我而言,應該看到foo是零,並且認識到無論剩下的是什麼,聲明是真實的,只是停止。 – ghostatron

+1

您已經否定了原始條件,因此您的答案不代表原始問題中的代碼。另外,如果'foo'沒有被初始化並且碰巧包含一個不同於0的值,那麼你的代碼也會(在絕大多數情況下)崩潰。此外,'&&'和'||'在C和Objective-C中短路。 – 2011-10-15 01:23:04