我确信之前已经问了很多次,但它仍然给我带来麻烦。我定义了我的类的布尔属性,如下所示:
@property(readwrite,assign) BOOL namesVisible;
它不会给编译器错误,但NSLogs为(null)。显然我在这里做错了什么,但我不知道它是什么。
答案 0 :(得分:8)
BOOL只是字符,0或1.因此,您不需要在属性声明中使用storage关键字,因此它应该是:
@property (readwrite) BOOL namesVisible;
其次,在记录BOOL时,使用int格式字符串%d或传入字符串:
NSLog(@"My Boolean: %d, or %@", object.namesVisible, object.namesVisible ? @"Yes" : @"No");
答案 1 :(得分:2)
因为您尝试使用%@
将其记录为对象,并且BOOL
不是对象,并且您的媒体资源价值为NO
而且您很幸运
最后一部分是因为你只是将BOOL
传递给NSLog
,但由于你的格式字符串表示期望一个对象指针,它将从参数堆栈中读取指针的值。由于指针大于BOOL
,因此读取的次数超过了传递它的次数。你很幸运它的所有四个/八个字节都有零(你的NO
只是其中之一);结果是它将description
消息发送到nil
,后者返回nil
作为描述字符串,在输出中打印为“(null)”。
如果你运气不好和/或财产价值为YES
,那么它会读取不是 nil
的内容,但可能不是指向存在的对象的指针。因此,尝试记录会导致崩溃,可能是EXC_BAD_ACCESS
种类。如果你同时运气不好和,那么你就会打印出一个实际物体的描述,并想知道你BOOL
看起来是怎么回事。
解决方案是两件事之一:
NSLog(@"My Boolean property: %d", (int)[myObject myBooleanProperty]);
或:
NSLog(@"My Boolean property: %@", [myObject myBooleanProperty] ? @"YES" : @"NO");
前者将布尔值转换为全尺寸int
并打印该值(最可能为0或1),而后者将通过@"YES"
或{{1} }作为参数取决于布尔值。由于NSString文字是(NSString)对象,@"NO"
格式化程序成为正确的格式。