了解布尔属性

时间:2014-01-13 09:48:55

标签: objective-c

在ARC中使用Xcode5,我正在为布尔值创建一个属性:

@property (nonatomic) BOOL done;

比我使用self.done

问题是,有时我会像这样使用它时出错。例如(错误):

//implicit conversion of bool to id disallowed in-ARC
[encoder encodeObject:self.done forKey:@"text"];

在这种情况下,我有两个问题: 1.何时以及为什么要用BOOL创建属性,这背后的逻辑是什么? 2.为什么我收到此错误?

2 个答案:

答案 0 :(得分:3)

问题2

您收到该错误是因为BOOL基本类型,并且编码器需要一个Object。你可以轻松解决用文字包装你的bool,比如

[encoder encodeObject:@(self.done) forKey:@"text"]

这基本上转换为:

[encoder encodeObject:[NSNumber numberWithBool:self.done] forKey:@"text"]

问题1

您可以使用BOOL创建属性,因为与NSNumber启动的BOOL更直接。例如,如果您想使用NSNumber对该bool执行ifs,则需要始终执行number.boolValue

声明属性与声明iVar的优势在于它为您提供了KVO就绪结构,并且您有一个入口点来获取值和一个入口点来设置值。在BOOL的情况下,这主要用于调试。虽然KVO也是一个加号:)(If you need more info on properties vs iVars follow my answer on SO

答案 1 :(得分:1)

正如您在

中看到的encodeObject:
[encoder encodeObject:self.done forKey:@"text"]; 

done不是Objective-C对象。相反,它是一个BOOL。

BOOL是typedef signed char BOOL;

您无法将BOOL类型设置为Obj-C对象NSNumber并对其进行编码。

[encoder encodeObject:@(self.done) forKey:@"text"];