2014-01-13 195 views
0

使用Xcode5与ARC,我创建一个属性的布尔:认识布尔属性

@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

不是说它对你的问题有所不同,它更多的是对约定的建议。对于BOOL属性,getters通常是'isDone',所以我会这么做'@property(nonatomic,getter = isDone)BOOL done;'只是一个建议,更像是Objective-C约定。 – Popeye

+0

非常感谢,我学到了一些东西。 – Curnelious

+0

@Popeye感动了一个好点。忘了那:)。当这个社区喜欢完成彼此时,我感到很高兴:p –

回答

3

问题2

你得到的是错误,因为BOOL基本类型和编码器期望的对象。您可以轻松地解决这个包裹你的布尔与文字,像这样

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

这基本上convertes到:

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

问题1

您可以BOOL创建一个属性,因为它更直接的是NSNumberBOOL开始。举例来说,如果你想用NSNumber这个布尔值,你需要一直做number.boolValue

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

+0

那么,为什么不只是设置一个布尔值作为实例变量没有属性? – Curnelious

+0

这是另一个问题,幸运的是我给出了一个答案 - http://stackoverflow.com/questions/20860078/benefits-of-using-setter-and-getter-methods-vs-direct-manipulation/20860304#20860304 。我希望它可以回答你:p –

1

正如你在

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

done看到encodeObject:不是一个Objective-C的对象。相反,它是一个BOOL。

BOOL是typedef signed char BOOL;

你不能框中BOOL类型的OBJ-C对象作为NSNumber和编码。

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

所以使bool的属性不会使他成为一个对象? 。所以我如何编码呢? – Curnelious

+1

编号属性可以是基元或对象。编码将bool转换为对象。正如我写的那样使它成为'NSNumber'。 –

+0

保存为'NSNumber'例如:'[NSNumber numberWithBool:self.done]' –