我的应用程序出错了,当我尝试修复它时,我调试方法时出现了一个非常奇怪的行为。
检查以下代码:(testString
是NSString
)
NSLog(@"logging:AAAA%@AAAA",[testObject testString]);
if ([[testObject testString] isEqualToString:@"(null)"]) {
NSLog(@"yeah im here!");
}
及其印刷:
logging:AAAA(null)AAAA
但它永远不会到达“是的我在这里!”。怎么可能?
答案 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!");
}