iOS开发陷阱之compare
来源:互联网 发布:世界顶级编程天才 编辑:程序博客网 时间:2024/05/15 07:58
iOS里compare的相关方法:
- (NSComparisonResult)compare:(NSString *)string;- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange;- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale;
NSComparisonResult 是定义的一个枚举,定义如下:
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
其中,NSOrderedSame 表示两个字符串完全一致,在枚举中值是0.
字符串比较在程序中很常见,比如:
if ([str1 compare:@"some text"] == NSOrderedSame) { // Do something } else { // Do something else }
但,如果如上中的str1为nil,根据Objective-C的消息调用规则(方法调用),对nil发送的任何消息,得到的返回都是nil。这样的情况下,运行时是不会像C/C++那样,出现空指针的非法访问而使得程序强行终止。也就是说,在Objective-C下面,即便str1为nil,也不会造成程序崩溃,而是会继续运行。
那么当str1为空的时候,[str1 compare:@"some text"] 消息的返回就会为nil。nil表示一个空的Objective-C对象,实际就是表示一个空指针,而它代表的值就是0,与NSOrderedSame的值相等. 如此,回到最前面的if语句,如果str1为nil,那么整个语句的值为真。这会给程序造成非常严重的问题,小则逻辑错误,UI显示错误等,大则会造成数据泄漏等等。。。所以,一旦出现这种情况,还是很严重的。
所以建议规避这种情况:
if (str1!=nil && [str1 compare:@"some text"] == NSOrderedSame) { // Do something } else { // Do something else }
或者:
if ([@"some text" compare:str1] == NSOrderedSame) { // Do something } else { // Do something else }str1=nil时,第二种情况的结果是1。就像防止java空指针异常一样,把确定有值的变量放在前面。
0 0
- iOS开发陷阱之compare
- iOS开发陷阱之NSString - compare
- iOS开发陷阱之NSString - compare
- iOS开发陷阱之NSString - compare
- iOS 之AutoReleasePool陷阱
- iOS开发陷阱之UITextField中文输入长度的限制
- iOS开发陷阱之UITextField中文输入长度的限制
- iOS开发 内存使用陷阱
- IOS开发-UIScrollView陷阱之----删除所有子view, 滚动条(indicator) 消失
- ios 开发 对象引用陷阱 解析
- ios开发nil检查、BOOL类型陷阱
- iOS compare字符串比较
- iOS compare用法
- Objective—C中的排序及Compare陷阱
- iOS compare 返回值变化
- Golong学习之常见开发陷阱,你遇到过几个?
- ios 内存使用陷阱
- ios 内存使用陷阱
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 迭代器特性
- 杭电 2010水仙花数
- 个发能换个房间那个和计划已经
- Swift编程语言学习10—— 枚举属性监视器
- iOS开发陷阱之compare
- 标记为系统必备组件,必须对其进行强签名
- Uva 10790 How Many Points of Intersection?
- 7.22
- 个发能换个房间那个和计划已经
- VC中CDC与HDC的区别以及二者之间的转换
- [转].NET平台下几种SOCKET模型的简要性能指标
- Android项目中引用到其他工程
- No.11 Xcode(5.1.x) 设备或程序旋转