Objective c 输出奇怪的NSString和isEqualToString
我的应用程序中出现了一个错误,当我试图修复它时,我在调试我的方法时出现了一个非常奇怪的行为 检查以下代码:(Objective c 输出奇怪的NSString和isEqualToString,objective-c,ios,nsstring,Objective C,Ios,Nsstring,我的应用程序中出现了一个错误,当我试图修复它时,我在调试我的方法时出现了一个非常奇怪的行为 检查以下代码:(testString是一个NSString) 及其印刷: logging:AAAA(null)AAAA 但它从来没有达到“是的,我在这里!”。这怎么可能?测试字符串的输出是nil 当传递nil对象时,NSLog生成“(null)”。但是,在nil对象上调用方法(如isEqualToString)的计算结果再次为nil,因此在“if”中为false。NSLog如果NSString为nil,
testString
是一个NSString
)
及其印刷:
logging:AAAA(null)AAAA
但它从来没有达到“是的,我在这里!”。这怎么可能?测试字符串的输出是
nil
当传递
nil
对象时,NSLog生成“(null)”。但是,在nil对象上调用方法(如isEqualToString
)的计算结果再次为nil
,因此在“if”中为false。NSLog
如果NSString
为nil
,则打印文本(null)
。将测试更改为:
if ([[testObject testString] == nil)
因为testObject本身是nil 您可以测试:
if ((testObject==nil)||([[testObject testString] isEqualToString:@"(null)"])) {
NSLog(@"yeah im here!");
}
因为testString方法返回nil,而对nil调用方法则没有任何作用。NSLog总是打印对象的描述 事实上,这是NS\u格式的函数
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
因此:
*stringForNSLog
应该正好是“(null)”
但是testString的值是nil
如果您正在研究GNUStep,一种苹果Cocoa的开源实现,您会发现如下内容:
所有字符串格式的东西都是用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];
并且在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];
非常感谢您的帮助,真的很有意思,我不知道。我真的很困惑,但我想起来太愚蠢了!请参阅我的答案,解释了NSLog的工作原理以及“(null)”的来源。
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];
if ((testObject==nil)||([[testObject testString] isEqualToString:@"(null)"])) {
NSLog(@"yeah im here!");
}