iOS中的(BOOL)和boolValue之间的差异

时间:2014-08-27 05:55:57

标签: ios objective-c iphone

这两行之间有什么区别?

alertObj.AlertAddressed=[[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)] boolValue];

alertObj.AlertAddressed=(BOOL)[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)];

我为这两行得到了不同的结果 - 为什么?

提前致谢。

4 个答案:

答案 0 :(得分:2)

第一个给你实际的bool值。

第二个类型转换为BOOL

的结果
[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)]

答案 1 :(得分:2)

我不知道你的指针有多好,但我试着解释

首先当你得到一个NSNumber它是一个对象,并且一个对象的值首先是它的指针(所以类似于0x0000af)这是一个简单的内存中的地址,这个地址包含你的NSNUmber包含实际值(所以假设你的例子中有一个bool信息)

这很简单,当你做

(BOOL)alertObj.AlertAddressed=(BOOL)[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)];

实际发生的是尝试将0x0000af部分转换为bool值...不是NSNumber包含的内容(实际获得的内容取决于当您尝试此操作时对象的当前指针)

alertObj.AlertAddressed=[[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)] boolValue];

这实际上是在NSNumber中实现的,因此它完全尊重对象的作用,并为您提供保存在NSNumber中的bool,而不是来自它的指针

答案 2 :(得分:1)

NSNumber是一个对象,BOOL是一种原始类型 NSNumber是一个包装数字的类,但是如果你想要你打开调用特定方法的话,你不能用它来进行操作。
由于NSNumber是一个对象,因此您的变量是一个指针,其中包含对象的引用,而不是值。
第一行是正确的,第二行是错误的,因为你正在转换一个指向bool类型的指针。

答案 3 :(得分:0)

alertObj.AlertAddressed=[[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)] boolValue]; 这会将您的值转换为BOOL

alertObj.AlertAddressed=(BOOL)[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)]; 这就像投射。考虑[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)]将返回bool值。