这两行之间有什么区别?
alertObj.AlertAddressed=[[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)] boolValue];
alertObj.AlertAddressed=(BOOL)[NSNumber numberWithBool:sqlite3_column_int(compiledStatement, 9)];
我为这两行得到了不同的结果 - 为什么?
提前致谢。
答案 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值。