打印BOOL类型时出现NSLog问题

时间:2012-06-19 00:26:36

标签: objective-c xcode nslog

(XCode 4.3) 为什么以下在带有EXC_BAD_ACCESS的NSLog语句中崩溃?

BOOL autoFlag
@property BOOL autoFlag
@synthesize autoFlag

[object setAutoFlag:YES]

NSLog(@"%@", [object autoFlag]);  //crashes here in debugger with EXC_BAD_ACCESS

我设法使用NSLog(@"%d"...来解决问题,打印1,但为什么@"%@"不起作用?我以为它只是将值转换为字符串?

2 个答案:

答案 0 :(得分:6)

%@用于打印作为NSObject类后代的对象的描述,但是这可以被覆盖以使您的对象打印出您想要的任何内容。

除非autoFlag是一个对象,否则会导致程序崩溃。在NSLog语句中获取这些类型的错误是很常见的,因为编译器无法告诉你想要打印什么样的“东西”,而且大部分时间它都不能事先知道(有一些例外,它会在哪里告诉你使用了错误的标识符。)

如果你想看到的是“真”或“是”,那么你需要像

这样的东西
NSLog(@"Auto Flag: %@",object.autoFlag? @"True":@"False");

答案 1 :(得分:2)

看看:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

%d有效,因为您告诉它将您的布尔值打印为整数,因此您将使用此方法返回0(false)或1(true)。布尔值没有特定的格式化程序。

您遇到了崩溃,因为代码期望使用%@指向内存地址的指针,而是给它一个原始数据类型,在这种情况下是一个布尔值。当应用程序尝试使用此地址并且没有对象时,您得到EXEC_BAD_ACCESS