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

Pet*_*rbo 6 casting objective-c

我认为这两种方法有什么区别做同样的事情(强制转换为a BOOL):

BOOL boolOne = (BOOL) [dictionary objectForKey:@"boolValue"];
BOOL boolTwo = [[dictionary objectForKey:@"boolValue"] boolValue];
Run Code Online (Sandbox Code Playgroud)

何时应该使用另一个?

Vla*_*mir 6

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

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


Mon*_*olo 6

他们是完全不同的.

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

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

作为具体示例,如果字典包含NSNumber与密钥相关联的字典@"boolValue",NSNumber则将接收消息,否则boolValue返回非零.YESNO

所以要回答你的问题,你应该使用第二种形式.将指针强制转换为BOOL很少有意义.