先看一段🌰代码
int a = 5;
if (a) {
// doSomething
}
按照普通的逻辑来说,代码应该会执行 doSomething操作,然而有时候事与愿违。
if ()小括号里面应当是一个BOOL值,代码在某种情况下说明 变量a并没有转化为YES,变量a的值为5,编辑器转化结果并不是YES。
这说明,此处有妖孽出没。
再来看我在项目里遇到的问题:
因为测试同学提出只在iPhone4s上面出现了问题(是的,没错,我们还在支持iPhone4),图片是我在iPhone4s上的运行结果,图片中,表达式用NSInteger result去接收结果是8,显示BOOL 变量x4结果为也是8,比较尴尬,x4并不是YES,或者是NO,通常认为用if(x4),即if(8)进行判断结果应当为真,会执行if(8){doSomething},遗憾的是并没有。
再来看我在iPhone7 Plus上面的运行结果: WX20190312-115216@2x.png
表达式完全相同,result的值为8,BOOL变量x4的结果为YES,不神奇,也不意外,本应如此的结果,问题是:为什么两个不同的设备会出现不一样的结果?
综合分析一下:
BOOL值在iOS设备上并不是非0即真,在不同的设备上可能有不同的表现,甚至是完全相反的表现。
具体更进一步分析iOS系统这样的表现原因可以参考:iOS-深挖BOOL
引申一下其它语言中关于非0是否为真的判断
image.png
在js中是非0即真的,在dart中非0为假,从多方面看来,用非0即真做判断,并非一个好的编程习惯。
说明:代码是维护的旧代码,这样凌乱的代码不是我写的。
网友评论