Objective c 打印布尔类型时出现NSLog问题

Objective c 打印布尔类型时出现NSLog问题,objective-c,xcode,nslog,Objective C,Xcode,Nslog,(代码4.3) 为什么下面的NSLog语句在EXC_BAD_访问时崩溃 BOOL autoFlag @property BOOL autoFlag @synthesize autoFlag [object setAutoFlag:YES] NSLog(@"%@", [object autoFlag]); //crashes here in debugger with EXC_BAD_ACCESS 我设法用NSLog(@“%d”…,它打印1,但为什么@“%@”不起作用?我以为它只是将值转换

(代码4.3) 为什么下面的NSLog语句在EXC_BAD_访问时崩溃

BOOL autoFlag
@property BOOL autoFlag
@synthesize autoFlag

[object setAutoFlag:YES]

NSLog(@"%@", [object autoFlag]);  //crashes here in debugger with EXC_BAD_ACCESS
我设法用
NSLog(@“%d”…
,它打印
1
,但为什么
@“%@”
不起作用?我以为它只是将值转换成字符串?

看一下:

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


您遇到了崩溃,因为代码希望使用
%@
指向内存地址的指针,而您给了它一个基本数据类型,在本例中是布尔值。当应用程序尝试使用此地址但没有对象时,您得到了一个
EXEC\u BAD\u访问
%@用于打印obj的描述作为NSObject类的后代的ECT,但是可以覆盖它以使对象打印任何您想要的内容

除非autoFlag是一个对象,否则它将使您的程序崩溃。在NSLog语句中出现这些类型的错误是很常见的,因为编译器无法告诉您要打印什么类型的“东西”,而且大多数情况下它无法事先知道(在某些情况下,它会告诉您使用了错误的标识符)

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

NSLog(@"Auto Flag: %@",object.autoFlag? @"True":@"False");

%@
用于打印对象。布尔值不是对象。这很有意义,但是否有用于将标量值打印为字符串的格式标识符,无论类型如何?PS:您应该作为答案而不是注释发布,我接受。
NSLog(@“%s”,标志?“是”):“否”)
--基本的C语言。如果你研究过这个问题,你就会知道,
%@
是用来打印对象的,BOOL不是对象。