布尔值作为Cocoa中的属性

时间:2010-09-19 01:23:42

标签: cocoa properties

我确信之前已经问了很多次,但它仍然给我带来麻烦。我定义了我的类的布尔属性,如下所示:

@property(readwrite,assign) BOOL namesVisible;

它不会给编译器错误,但NSLogs为(null)。显然我在这里做错了什么,但我不知道它是什么。

2 个答案:

答案 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"格式化程序成为正确的格式。