在移動端APP開發(fā)中,崩潰率是一個衡量APP性能的一個很重要的指標桃漾。常見的崩潰有服務(wù)器返回數(shù)據(jù)崩潰坏匪、內(nèi)存泄漏崩潰、多個子線程同時操作ui崩潰撬统。
服務(wù)器返回數(shù)據(jù)異常崩潰
服務(wù)器返回的數(shù)據(jù)通常有數(shù)字适滓、字符串、 數(shù)組和字典四種類型恋追,倘若服務(wù)器返回異常數(shù)據(jù)null凭迹,程序有可能把它當(dāng)做以上四種中的其中一種處理颅崩,必會導(dǎo)致 unrecognized selector 崩潰。
NSNull 分類
iOS 會把收到的 json 值 null 解析成 NSNull 字段蕊苗,這時候可以在 NSNull 分類中轉(zhuǎn)發(fā)以上四種類型的消息,防止崩潰沿彭。
#define JsonObjects @[@"",@0,@{},@[]]
@implementation NSNull (safe)
- (id)forwardingTargetForSelector:(SEL)aSelector {
if (![self respondsToSelector:aSelector]) {
// 沒有實現(xiàn)的方法朽砰,從四種常見數(shù)值對象中查找
for (id jsonObj in JsonObjects) {
if ([jsonObj respondsToSelector:aSelector]) {
NSLog(@"消息響應(yīng)對象用%@代替",[jsonObj class]);
return jsonObj;
}
}
}
return [super forwardingTargetForSelector:aSelector];
}
@end
測試方法如下:
-(void)test1{
NSDictionary *dict = [NSNull null];
[dict objectForKey:@"12"];
}
NSNumber 等的分類
另外,對于約定好服務(wù)器返回字符串類型的喉刘,結(jié)果卻返回了數(shù)值類型瞧柔,在給NSNumber對象發(fā)送NSString 類型的消息時,可以在 NSNumber 睦裳、NSString造锅、NSArray、NSDictionary 分類中按照以上方式轉(zhuǎn)發(fā)消息廉邑。
#define JsonObjects @[@"",@0,@{},@[]]
@implementation NSNumber (safe)
- (id)forwardingTargetForSelector:(SEL)aSelector {
if (![self respondsToSelector:aSelector]) {
// 沒有實現(xiàn)的方法哥蔚,從四種常見數(shù)值對象中查找
for (id jsonObj in JsonObjects) {
if ([jsonObj respondsToSelector:aSelector]) {
NSLog(@"消息響應(yīng)對象用%@代替",[jsonObj class]);
return jsonObj;
}
}
}
return [super forwardingTargetForSelector:aSelector];
}
@end
測試方法如下:
-(void)test2{
NSString *num = @(12);
num = [num stringByAppendingString:@"元"];
NSLog(@"%@",num);
}