2

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

检查以下代码:(testString是一个NSString

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

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

及其印刷:

logging:AAAA(null)AAAA

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

4

6 回答 6

3

的输出testStringnil

nilNSLog 在传递一个对象时产生“(null)” 。然而,在 nil 对象上调用方法(如isEqualToString)再次评估为nil,因此在“if”中为 false。

于 2012-09-03T14:07:01.397 回答
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。

如果您正在研究 GNUStep,它是 Apple 的 Cocoa 的开源实现,您会发现如下内容:

所有的字符串格式的东西都写成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

于 2012-09-03T14:36:51.273 回答
1

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

于 2012-09-03T14:11:59.480 回答
0
if ((testObject==nil)||([[testObject testString] isEqualToString:@"(null)"])) {
    NSLog(@"yeah im here!");
}
于 2012-09-04T18:29:14.577 回答
0

NSLog(null)如果您的NSStringis ,则打印文字nil。将您的测试更改为:

if ([[testObject testString] == nil)
于 2012-09-03T14:07:03.480 回答
0

因为 testObject 本身是 nil 。

你可以测试:

if ((testObject==nil)||([[testObject testString] isEqualToString:@"(null)"])) {
    NSLog(@"yeah im here!");
}
于 2012-09-03T14:07:16.077 回答