首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解布尔性质

问理解布尔性质
EN

Stack Overflow用户
提问于 2014-01-13 09:48:54
回答 2查看 97关注 0票数 0

使用Xcode5和ARC,我将为布尔值创建一个属性:

代码语言:javascript
复制
@property (nonatomic) BOOL done;

而不是我和self.done一起使用它。

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

代码语言:javascript
复制
//implicit conversion of bool to id disallowed in-ARC
[encoder encodeObject:self.done forKey:@"text"];

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-13 09:53:27

问题2

您将得到该错误,因为BOOL是基元类型的,编码器需要一个对象。您可以轻松地用文字来解决这个问题,如下所示

代码语言:javascript
复制
[encoder encodeObject:@(self.done) forKey:@"text"]

这基本上转化为:

代码语言:javascript
复制
[encoder encodeObject:[NSNumber numberWithBool:self.done] forKey:@"text"]

问题1

您可以使用BOOL创建属性,因为使用BOOL启动的NSNumber更直接。例如,如果您想使用NSNumber在bool上执行ifs,那么您需要一直执行number.boolValue。

声明属性与声明iVar的优点是,它为您提供了一个KVO就绪结构,并且您有一个入口点来获取该值,并有一个入口点来设置该值。在BOOL的情况下,这主要用于调试。虽然KVO也是一个加号:) (如果您需要更多关于属性与iVars的信息,请按照我的回答)

票数 3
EN

Stack Overflow用户

发布于 2014-01-13 09:50:35

正如你在encodeObject:中所看到的

代码语言:javascript
复制
[encoder encodeObject:self.done forKey:@"text"]; 

但是done不是一个目标C对象.相反,它是一个BOOL。

BOOL是typedef signed char BOOL;

不能将BOOL类型框为object对象作为NSNumber并对其进行编码。

代码语言:javascript
复制
[encoder encodeObject:@(self.done) forKey:@"text"]; 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21088107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档