2012-09-03 56 views
2

我得到了一個錯誤,在我的應用程序,當我試圖解決它我有一個非常奇怪的行爲,當我調試我的方法。NSString和isEqualToString與奇怪的輸出

檢查下面的代碼:(testStringNSString

NSLog(@"logging:AAAA%@AAAA",[testObject testString]); 

if ([[testObject testString] isEqualToString:@"(null)"]) { 
    NSLog(@"yeah im here!"); 
} 

和打印:

logging:AAAA(null)AAAA 

但它從來沒有達到 「這裏耶IM!」。這怎麼可能?

回答

3

testString的輸出是nil

當通過nil對象時,NSLog產生「(null)」。然而,調用無方法對象的方法(如isEqualToString)的計算結果爲nil,因此在「if」中爲false。

+0

非常感謝你的幫助,真有意思,我不知道。我真的很困惑,但我很愚蠢的想想! – NDY

+0

看到我的回答,解釋的NSLog是如何工作的,以及其中,「(空)」的由來。 – YuAo

0

NSLog打印文字(null)如果您的NSStringnil。將您的測試更改爲:

if ([[testObject testString] == nil) 
0

因爲testObject本身就是零。

,你可以測試:

if ((testObject==nil)||([[testObject testString] isEqualToString:@"(null)"])) { 
    NSLog(@"yeah im here!"); 
} 
1

因爲的TestString方法返回零,並呼籲無什麼都不做的方法。

2

NSLog總是打印對象的描述。

實際上它是NS_FORMAT_FUNCTION。

FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); 

所以:

NSString *stringForNSLog = [NSString stringWithFormat:@"%@",[testObject testString]]; 

*stringForNSLog應該正好是 「(空)」。

但是testString的值爲零。

如果你正在尋找進入GNUstep的,一個開源實現蘋果的可可,你會發現這樣的事情:

所有字符串格式的東西都寫在GSFormat.m

GSFormat.m

size_t len; 
id obj; 
NSString *dsc; 

obj = args_value[specs[nspecs_done].data_arg].pa_object; 

if (!obj) dsc = @"(null)"; 
else if ([obj respondsToSelector: @selector(descriptionWithLocale:)]) dsc = [obj descriptionWithLocale: locale]; 
else dsc = [obj description]; 

http://svn.gna.org/svn/gnustep/libs/base/trunk/Source/NSString.m

http://svn.gna.org/svn/gnustep/libs/base/trunk/Source/GSFormat.m

+0

感謝您的詳細解答。十分有趣! – NDY

0
if ((testObject==nil)||([[testObject testString] isEqualToString:@"(null)"])) { 
    NSLog(@"yeah im here!"); 
}