(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
,但为什么@"%@"
不起作用?我以为它只是将值转换为字符串?
答案 0 :(得分:6)
%@用于打印作为NSObject类后代的对象的描述,但是这可以被覆盖以使您的对象打印出您想要的任何内容。
除非autoFlag是一个对象,否则会导致程序崩溃。在NSLog语句中获取这些类型的错误是很常见的,因为编译器无法告诉你想要打印什么样的“东西”,而且大部分时间它都不能事先知道(有一些例外,它会在哪里告诉你使用了错误的标识符。)
如果你想看到的是“真”或“是”,那么你需要像
这样的东西NSLog(@"Auto Flag: %@",object.autoFlag? @"True":@"False");
答案 1 :(得分:2)
%d
有效,因为您告诉它将您的布尔值打印为整数,因此您将使用此方法返回0
(false)或1
(true)。布尔值没有特定的格式化程序。
您遇到了崩溃,因为代码期望使用%@
指向内存地址的指针,而是给它一个原始数据类型,在这种情况下是一个布尔值。当应用程序尝试使用此地址并且没有对象时,您得到EXEC_BAD_ACCESS
。