在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.为什么我收到此错误?
答案 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"];