在与蓝牙设备交互的过程中发生这种错误,在iOS10的设备上出现崩溃的次数尤其多。
造成问题的原因
之所以会发生崩溃是因为系统用一个NSData数组里的每一个NSData来初始化一个CBUUID,这个数组是如何产生的暂不知道,但是这里面会存在一些格式有问题的NSData对象(字节数不为2、4、16,CBUUID初始化方法明确要求传入的NSData对象的字节数为2或4或16), image.png用有问题的NSData去初始化CBUUID的时候就发生崩溃了。
解决方案
通过MethodSwizing改变·+ (CBUUID *)UUIDWithData:(NSData *)theData;
方法的实现,在传入的NSData对象格式不符合要求时直接返回一个空对象即可,代码如下。
#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(@"这是一个不合法的UUID格式");
return nil;
}
网友评论