在與藍(lán)牙設(shè)備交互的過程中發(fā)生這種錯(cuò)誤罩句,在iOS10的設(shè)備上出現(xiàn)崩潰的次數(shù)尤其多柒室。
造成問題的原因
之所以會發(fā)生崩潰是因?yàn)橄到y(tǒng)用一個(gè)NSData數(shù)組里的每一個(gè)NSData來初始化一個(gè)CBUUID甸饱,這個(gè)數(shù)組是如何產(chǎn)生的暫不知道耕皮,但是這里面會存在一些格式有問題的NSData對象(字節(jié)數(shù)不為2、4谊惭、16汽馋,CBUUID初始化方法明確要求傳入的NSData對象的字節(jié)數(shù)為2或4或16),用有問題的NSData去初始化CBUUID的時(shí)候就發(fā)生崩潰了圈盔。
解決方案
通過MethodSwizing改變·+ (CBUUID *)UUIDWithData:(NSData *)theData;
方法的實(shí)現(xiàn)豹芯,在傳入的NSData對象格式不符合要求時(shí)直接返回一個(gè)空對象即可,代碼如下驱敲。
#import "CBUUID+Extension.h"
#import <objc/message.h>
@implementation CBUUID (Extension)
+ (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
{
Method method1 = class_getClassMethod([self class], @selector(UUIDWithData:));
Method method2 = class_getClassMethod([self class], @selector(sy_UUIDWithData:));
method_exchangeImplementations(method1, method2);
}
});
}
+ (CBUUID *)sy_UUIDWithData:(NSData *)theData{
if (theData.length == 2 || theData.length == 4 || theData.length == 16) {
return [self sy_UUIDWithData:theData];
}
NSLog(@"這是一個(gè)不合法的UUID格式");
return nil;
}