在Objective-C开发中,经常会遇到类型为空的判断,如果不进行判断,就会崩溃,特别是网络请求后数据的判断以及赋值前的判断,下面是对类型判断做的一些总结,不足之处,请指正,欢迎补充!
一、nil、Nil、NULL、NSNull、NSNotFound的特点
01、nil 定义一个实例为空, 指向oc中对象的空指针.是对Objective-C id 对象赋空值,对于Objective-C 集合类对象 比如数组对象,字典对象,当我们不需要再使用他们的时候,对他们release 的同时最好也把他们赋值为nil,这样确保安全性,如果不赋值nil,可能导致野指针。
/// 对象
Person *p = [[Person alloc] init];
p = nil;
/// 字符串
NSString *string = @"hello 2017";
string = nil;
/// 字典...
NSDictionary *dict = [NSDictionary dictionary];
dict = nil;
02、Nil是一个类指针为空
Class cs = Nil;
03、NULL可以用在C语言的各种指针上,在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值。而且我们对于nil调用方法,不会产生crash或者抛出异常。
NSArray *array = @[[NSNull null]];
NSDictionary *dict1 = @{@"key":[NSNull null]};
04、NSNotFound 表示一个整型不存在,其实表示一个整型的最大值(NSIntegerMax)
NSInteger num = NSNotFound;
/// 文档显示,NSNotFound表示 NSInteger 的最大值
static const NSInteger NSNotFound = NSIntegerMax;
二、Objective-C中为空或相同判断
01、判断基本数据类型为空
/// 判断整型是否存在
NSInteger num = 21;
if (num == NSNotFound) {//...}
/// 判断字符串是否为空
+ (BOOL)isNullOrEmpty:(NSString *)s {
if(s == nil ||
s.length == 0 ||
[s isEqualToString:@""] ||
[s isEqualToString:@"(null)"]) {
return YES;
}
return NO;
}
/// 判断数组或者字典为空
if (arr == nil || arr.count == 0) {
}
/// 判断字典或者数组元素为空
if ([arr.firstObject isEqualToString:@"(null)"] ||
[arr.firstObject isEqualToString:@""] ||
[arr.firstObject isEqual:[NSNull null]]) {
}
02、判断基本数据类型相同
// 判断两个数字相同
num1 == num2 // (num1/num2 可以为Int/NSInteger/CGFloat/double等)
// 判断两个字符串相同
[string1 isEqualToString:string2];
// 判断两个字典相同
[dict1 isEqualToDictionary:dict2];
// 判断两个数组相同
[array1 isEqualToArray:array2];
03、判断事例对象相同
/// 判断两个实例是否相同
[class1 isEqual:class2];
/// 判断是否是这个类或者是这个类子类的实例
-(BOOL) isKindOfClass: classObj
/// 判断是否是这个类的实例
-(BOOL) isMemberOfClass: classObj