前言:AFNetworking是我們常用的三方庫域携,我們需要對請求下來的responceObject進行操作,很多時候我們不能與后臺協(xié)商一致鱼喉,或者做到完美過濾秀鞭,就會導(dǎo)致程序崩潰。比如后臺默認數(shù)據(jù)是個數(shù)組扛禽,但是給了個字符串或者空值锋边,這時候你再去調(diào)用array.count,就會導(dǎo)致crash编曼。為了避免這類錯誤豆巨,就需要全面的對數(shù)據(jù)進行過濾。
對于此類判斷數(shù)組是否為空掐场,很多人給出的方法
if (array != nil && ![array isKindOfClass:[NSNull class]] && array.count != 0){
//執(zhí)行array不為空時的操作
}
嚴格來說這樣的判斷是錯誤的往扔,當array不是[NSArray class]的時候,調(diào)用array.count就會crash
下面我們來做個實驗
NSObject *obj = [NSObject new];
NSArray *array = (NSArray *)obj;
NSLog(@"---%@",array);
NSLog(@"---%ld",array.count);
輸出
---<NSObject: 0x600001dcc2d0>
-[NSObject count]: unrecognized selector sent to instance 0x600001dcc2d0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSObject count]: unrecognized selector sent to instance 0x600001dcc2d0'
當用array接收一個對象熊户,(NSArray *)并不能強制轉(zhuǎn)換萍膛,只是告訴編譯器你的接收對象是[NSArray class],頂多消除個警告罷了敏弃。這就導(dǎo)致了當你用數(shù)組接收responceObject某個字段對應(yīng)的數(shù)據(jù)的時候報錯卦羡。你以為你把數(shù)據(jù)轉(zhuǎn)換成了[NSArray class],然而并沒有
舉例
NSDictionary *dic = @{@"a": @"123"};
NSArray *array = (NSArray *)dic[@"a"];
NSLog(@"---%@",array);
---123
可見接收對象是個字符串麦到。如果這時候調(diào)用array.count绿饵,肯定會crash。
所以在調(diào)用array.count或者其他數(shù)組的方法的時候瓶颠,最好判斷這個對象是否是[NSArray class]
下面是我的方法
#pragma mark 判斷是否是數(shù)組
+(BOOL)isArray:(NSArray *)array{
if (array == nil) {
return NO;
}
if ([array isKindOfClass:[NSNull class]]) {
return NO;
}
if (![array isKindOfClass:[NSArray class]]){
return NO;
}
return YES;
}
同理判斷是否是字典拟赊,字符串也是大同小異
#pragma mark 判斷是否是字典
+(BOOL)isDictionary:(NSDictionary *)dic{
if (dic == nil) {
return NO;
}
if ([dic isKindOfClass:[NSNull class]]) {
return NO;
}
if (![dic isKindOfClass:[NSDictionary class]]){
return NO;
}
return YES;
}
#pragma mark 判斷是否是字符串
+(BOOL)isString:(NSString *)string{
if (string == nil) {
return NO;
}
if ([string isKindOfClass:[NSNull class]]) {
return NO;
}
if (![string isKindOfClass:[NSString class]]){
return NO;
}
if ([string isEqualToString:@"null"]) {
return NO;
}
if ([string isEqualToString:@"<null>"]) {
return NO;
}
return YES;
}
以上就是我總結(jié)的方法,僅供參考粹淋,如果有未考慮到位的地方吸祟,歡迎指出,謝謝