强制转换为BOOL并发送消息boolValue有什么区别?

时间:2011-12-02 14:47:05

标签: objective-c casting

我相信这两种方法之间的区别是什么(转换为BOOL):

BOOL boolOne = (BOOL) [dictionary objectForKey:@"boolValue"];
BOOL boolTwo = [[dictionary objectForKey:@"boolValue"] boolValue];

何时应该使用另一个?

3 个答案:

答案 0 :(得分:6)

不,他们不一样。区别在于第二个是正确的,第一个不是。

在第1行中,您只需将指针转换为BOOL,这大致相当于检查指针是否为零,与实际存储在对象中的值无关。

答案 1 :(得分:6)

他们完全不同。

第一个从字典中获取一个对象指针,然后将指针解释为BOOL。这意味着任何非nil指针都将被解释为YES,而nil将被解释为NO。在具体示例中,由于词典不能包含nil个指针,因此您只能从这行代码中获得YES

第二个从字典中获取相同的对象,然后将消息boolValue发送到该对象。据推测,如果对象识别出该消息,那么将导致该对象的BOOL版本。

作为一个具体示例,如果字典包含与密钥NSNumber关联的@"boolValue",则NSNumber将收到消息boolValue,如果它不是归零YES,否则为NO

所以要回答你的问题,你应该使用第二种形式。投射指向BOOL的指针很少有意义。

答案 2 :(得分:3)

[[dictionary objectForKey:@"boolValue"] boolValue];

不是强制转换,而是在NSNumber上调用一个返回bool的方法。可能涉及演员阵营 - 但实施细节不公开。