Objective c 打印布尔类型时出现NSLog问题
(代码4.3) 为什么下面的NSLog语句在EXC_BAD_访问时崩溃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,但为什么@“%@”不起作用?我以为它只是将值转换
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不是对象。