带有奇怪输出的NSString和isEqualToString

时间:2012-09-03 14:04:58

标签: objective-c ios nsstring

我的应用程序出错了,当我尝试修复它时,我调试方法时出现了一个非常奇怪的行为。

检查以下代码:(testStringNSString

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

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

及其印刷:

logging:AAAA(null)AAAA

但它永远不会到达“是的我在这里!”。怎么可能?

6 个答案:

答案 0 :(得分:3)

testString的输出为nil

NSLog在传递nil对象时生成“(null)”。但是,在nil对象上调用方法(如isEqualToString)会再次评估为nil,因此在“if”中为false。

答案 1 :(得分:2)

NSLog始终打印对象的描述。

实际上它是NS_FORMAT_FUNCTION。

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

所以:

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

*stringForNSLog应该完全是“(null)”。

但是testString的值是nil。

如果您正在研究Apple的Cocoa的开源实现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

答案 2 :(得分:1)

因为testString方法返回nil并且在nil上调用方法什么都不做。

答案 3 :(得分:0)

如果NSLog(null)

NSString会打印文字nil。将您的测试更改为:

if ([[testObject testString] == nil)

答案 4 :(得分:0)

因为testObject本身就是nil。

你可以测试一下:

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

答案 5 :(得分:0)

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