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!");
}