當網(wǎng)絡(luò)請求返回null,然后對數(shù)據(jù)進行操作就會導(dǎo)致崩潰,
-[NSNull length]: unrecognized selector sent to instance 0x388a4a70
因為NSNull不是字符串,也不是nil,只有一個方法
+ (NSNull *)null;
處理返回值為空有幾種做法
后臺處理
后臺處理數(shù)據(jù)并判斷之后返回。但是由于iOS和android的不同,不太可行。
不管server加沒加為空的處理,自己的代碼健壯性還是要有的,利用isKindOfClass來判斷返回類型并進行處理
用這種方法會導(dǎo)致判斷代碼過多,不太可行。如果用的是AFNetWorking,它自帶了一個屬性
/**
Whether to remove keys with `NSNull` values from response JSON. Defaults to `NO`.
*/
@property (nonatomic, assign) BOOL removesKeysWithNullValues;
修改值為YES,即可處理
((AFJSONResponseSerializer *)manage.responseSerializer).removesKeysWithNullValues = YES;
使用老外寫的類別NullSafe
直接將.m導(dǎo)入進工程即可。
在運行時操作,將NSNull進行處理變成nil,因為nil是安全的,可以向nil對象發(fā)送任何message而不會崩潰。在封裝的網(wǎng)絡(luò)請求中,對返回的數(shù)據(jù)進行處理,實現(xiàn)類型NullSafe中的數(shù)據(jù)處理,類似這樣的操作
if ([propertyValue isKindOfClass:[NSNull class]]){//null類型賦值為空
[object setValue:@"" forKey:propertyName];
}
//nil 是 ObjC 對象的字面空值,對應(yīng) id 類型的對象,或者使用 @interface 聲明的 ObjC 對象。
NSString *strDemo = nil;
NSURL *urlDemo = nil;
id objDemo = nil;
//Nil 是 ObjC 類類型的書面空值,對應(yīng) Class 類型對象。
Class classDemo = Nil;
Class classDemoStr = [NSString class];
//NSNull 是一個代表空值的類,是一個 ObjC 對象。實際上它只有一個單例方法:+[NSNull null],一般用于表示集合中值為空的對象。
// 因為 nil 被用來用為集合結(jié)束的標志,所以 nil 不能存儲在 Foundation 集合里。
NSArray *arrDemo = [NSArray arrayWithObjects:@"one", @"two", nil];
// 錯誤的使用
NSMutableDictionary *dicDemo = [NSMutableDictionary dictionary];
[dicDemo setObject:nil forKey:@"someKey"];
// 正確的使用
NSMutableDictionary *mutdicDemo = [NSMutableDictionary dictionary];
[mutdicDemo setObject:[NSNull null] forKey:@"someKey"];