2012-09-03 133 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!"); 
}