ios开发nil检查、BOOL类型陷阱
来源:互联网 发布:淘宝店铺购买 编辑:程序博客网 时间:2024/05/22 06:43
nil检查
仅在校验逻辑流程时做nil检查。
使用nil检查不是为了防止程序崩溃,而是校验逻辑流程。向一个空对象发送一条消息是由Objective-C运行时处理的。方法没有返回结果,你也可以安心走下去.然而这里也有一种.
注意这里和C/C++的空指针检查是完全不同的,在那些环境里,并不处理空指针情况并可能导致你的应用程序崩溃。不过你仍要自己确保提领的指针不为空。
BOOL类型陷阱
整形的转换为BOOL型的时候要小心。不要直接和YES做比较。
BOOL在Objective-C里被定义为unsignedchar,这意味着它不仅仅只有YES(1)和NO(0)两个值。不要直接把整形强制转换为BOOL型。常见的错误发生在把数组大小,指针的值或者逻辑位运算的结果赋值到BOOL型中,而这样就导致BOOL值的仅取决于之前整形值的最后一个字节,有可能出现整形值不为0但被转为NO的情况。应此把整形转为BOOL型的时候请使用ternery操作符,保证返回YES或NO值。
在BOOL,_BOOL以及bool(见C++Std4.7.4,4.12以及C99Std6.3.1.2)之间可以安全的交换值或转型。但BOOL和Boolean之间不可,所以对待Boolean就像上面讲的整形一样就可以了。在Objective-C函数签名里仅使用BOOL。
对BOOL值使用逻辑运算(&&,||,!)都是有效的,返回值也可以安全的转为BOOL型而不需要ternery操作符。
还有,不要把BOOL型变量直接与YES比较。这样不仅对于精通C的人很有难度,而且此条款的第一点也说明了这样做未必能得到你想要的结果。
代码
仅在校验逻辑流程时做nil检查。
使用nil检查不是为了防止程序崩溃,而是校验逻辑流程。向一个空对象发送一条消息是由Objective-C运行时处理的。方法没有返回结果,你也可以安心走下去.然而这里也有一种.
注意这里和C/C++的空指针检查是完全不同的,在那些环境里,并不处理空指针情况并可能导致你的应用程序崩溃。不过你仍要自己确保提领的指针不为空。
BOOL类型陷阱
整形的转换为BOOL型的时候要小心。不要直接和YES做比较。
BOOL在Objective-C里被定义为unsignedchar,这意味着它不仅仅只有YES(1)和NO(0)两个值。不要直接把整形强制转换为BOOL型。常见的错误发生在把数组大小,指针的值或者逻辑位运算的结果赋值到BOOL型中,而这样就导致BOOL值的仅取决于之前整形值的最后一个字节,有可能出现整形值不为0但被转为NO的情况。应此把整形转为BOOL型的时候请使用ternery操作符,保证返回YES或NO值。
在BOOL,_BOOL以及bool(见C++Std4.7.4,4.12以及C99Std6.3.1.2)之间可以安全的交换值或转型。但BOOL和Boolean之间不可,所以对待Boolean就像上面讲的整形一样就可以了。在Objective-C函数签名里仅使用BOOL。
对BOOL值使用逻辑运算(&&,||,!)都是有效的,返回值也可以安全的转为BOOL型而不需要ternery操作符。
代码
// AVOID - (BOOL)isBold { return [self fontTraits] & NSFontBoldTrait; } - (BOOL)isValid { return [self stringValue]; } // GOOD - (BOOL)isBold { return ([self fontTraits] & NSFontBoldTrait) ? YES : NO; } - (BOOL)isValid { return [self stringValue] != nil; } - (BOOL)isEnabled { return [self isValid] && [self isBold]; }
还有,不要把BOOL型变量直接与YES比较。这样不仅对于精通C的人很有难度,而且此条款的第一点也说明了这样做未必能得到你想要的结果。
代码
// AVOID BOOL great = [foo isGreat]; if (great == YES) // ...be great! // GOOD BOOL great = [foo isGreat]; if (great) // ...be great!
0 0
- ios开发nil检查、BOOL类型陷阱
- 特殊类型BOOL和nil
- IOS开发---OC语言-②BOOL类型
- ios开发——输出BOOL类型的值
- 【iOS开发之Objective-C】布尔(Boolean)类型--BOOL
- FCC--Boo who(BOOL类型检查)
- iOS开发 nil,Nil,NULL的区别
- iOS开发nil/Nil/NULL的区别
- iOS开发学习第二课——BOOL类型/if语句/switch语句
- IOS开发之Xcode下LLDB调试技巧_Debug_更改BOOL类型的值
- iOS强制类型转换陷阱
- ios中NSString的bool类型
- 浅述IOS用到的BOOL类型
- iOS如何输出BOOL类型值
- iOS—对于BOOl类型的理解
- (0047)iOS开发之nil/Nil/NULL的区别
- iOS开发-nil/Nil/NULL/NSNull 的使用
- bool判断中的“!”陷阱
- Android连接手机后无法访问SD卡
- C++之拷贝构造函数和赋值构造函数
- C++之函数指针
- 网络编程——进程间通信(匿名管道)
- QScrollBar样式
- ios开发nil检查、BOOL类型陷阱
- 飞鱼开发框架(四) 窗体自动获取用户登录信息
- 动态链接库DLL
- 搬运工 Spring MVC 教程,快速入门,深入分析
- javaweb学习总结(java增强)
- 双向冒泡排序
- [Leetcode] Generate Parentheses (Java)
- 设计模式之模板模式
- 用C++设计一个不能被继承的类