2011-05-11 42 views
1

嘗試比較網絡服務返回的字段,其中只包含字符串truefalse(YES,它是STRING而不是布爾值),所以我嘗試比較它用另一個字符串是這樣的:[NSNull isEqualToString:]:無法識別的選擇器發送到實例

if ([withOptions isEqualToString:@"true"]) { 
       [email protected]"with"; 
      }else { 
       [email protected]"without"; 
      } 

所以當withOptions字符串中包含的「真實」的字符串,一切正常,當它包含了「假」的字符串我得到這個例外在日誌中:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x2984d68' 

我很確定在所有情況下,withOptions都包含一個字符串值(「true」或「false」),它從不包含NULL。

+2

你不應該那麼肯定'withOptions'始終是一個字符串。 'withOptions'是拋出這個錯誤時'NSNull'的一個實例。有兩種可能的原因:您從可能返回'+ [NSNull null]'的方法中檢索'withOptions',例如,表示未找到,或者您損壞了內存,並且所有投注都關閉。 –

+0

嗨,你能解釋我的第二個原因嗎? THX – Luca

+0

這將意味着你的地方在發佈的對象和新的對象是在同一地址(不同類型的對象)進行分配。儘管如此,這不可能是發生的事情,因爲'+ null'返回在應用生命週期中很早分配的單例。巴里的第一個原因很可能是它。 – bbum

回答

3

我敢肯定,在任何情況下, withOptions包含一個字符串值 (無論是「真」或「假」),它 決不會包含NULL。

顯然,這種假設是錯誤的。 :)

在那if()聲明前行中,添加NSLog(@"%@ - %@", withOptions, [withOptions class]);

並不是說NSNullNULL是不一樣的東西; NSNull是一類,它的單實例表示容器(和其他東西)「沒有價值」不接受nil作爲值。

當該碰撞發生時,withOptions指的是的NSNull一個實例。

+0

嗨,我已經考慮過了,我測試了字符串類'withOptions',並在日誌中獲得了'NSCFString',這就是爲什麼我會考慮Barry的第二個原因:) – Luca

+0

'withOptions'在if()'語句之前的行上是'NSCFString'類型,然後在'if()'語句中崩潰,因爲它變成了'NSNull'。它仍然可能是內存損壞,但底線是'withOptions'包含對'NSNull'的引用,如果該if()'語句是實際崩潰發生的地方。 – bbum

+0

嗨,我試圖trach錯誤,我發現問題可能不是來自isEqual函數,請在這裏看到我的新帖子,我已經提前解釋了我的問題,thx:http://stackoverflow.com/questions/ 5970981 /異常nsnull-isequaltostring-無法識別的選擇器,當-I-點擊上callou – Luca

0

這是我的代碼,便於理解。

if ([[info objectForKey:@"address"] isKindOfClass:[NSNull class]]) { 
      dto.address = @"Unknown"; 
} 
0

如果你想要做一個安全comparaison和你不是100%,你的「withOption」包含一個字符串,因爲它可能是空的情況下(在沒有選項已被賦予的情況下),你可以做這樣的:

if ([@"true" isEqualToString:withAnnotation]) { 
    [email protected]"with"; 
}else { 
    [email protected]"without"; 
} 

請注意,您甚至可以縮短comparaison:

annotation.stationLavage=[@"true" isEqualToString:withAnnotation][email protected]"with":@"without"; 
相關問題