标签:好的 网络层 修复 访问 mutable toast 总线 table set
SIGSEGV
一般情况下,SIGSEGV是由于内存地址不合法造成。因为无效的内存访问导致的,一般是指针指向不存在的地址所导致(Invalid memory reference);
SIGBUS
一般情况下,SIGBUS是因为内存地址没有对齐导致。
因为总线出错(bus error)。地址一般是先校验地址对齐再校验其他的,校验地址对齐后会放入数据总线,这时有问题就会报SIGBUS的错误。
SIGABRT
异常终止条件,例如abort()。
1、3、6是修复crash过程中常遇到的crash类型。
1. crashName=NSInvalidArgumentException ,crashReason=data parameter is nil
(1) [aMutableDictionary setObject:nil forKey:]; object can not be nil. [__NSDictionaryM removeObjectForKey:nil]: key cannot be nil (2) [aString hasSuffix:nil]; nil argument crash. [aString hasPrefix:nil]; nil argument crash. (3) aString = [NSMutableString stringWithString:nil];nil argument crash. aString = [[NSString alloc] initWithString:nil]; nil argument crash. (4) aURL = [NSURL fileURLWithPath:nil]; nil argument crash. (5) [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];data is nil crash (6) [aMutableArray addObject:nil], 添加nil crash。 (7) UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = nil;// setString参数nil则crash (8)if(controller.presentedViewController != nil) { [controller dismissViewControllerAnimated:NO completion:^{ //controller.presentedViewController为nil则presentViewController:方法会crash [controller presentViewController:self.imagePickerController animated:YES completion:nil]; }]; }else{ [controller presentViewController:self.imagePickerController animated:YES completion:nil]; }
2. 属性的内存管理语义设置的_unsafe_unretain,出现野指针;
ios9.0之前Notification未注销带来的僵尸对象问题。
3. 数据类型错误带来的unrecognized selector crash
例1:常见jsbridge中,jsapi_toast调用时传参数应为NSString,业务方传入的数据为Dictionary,崩溃.
例2: 网络层中将NSData转换成NVBaseModel,返回的数据和移动之家上定义的数据不一致,带来的崩溃。
例3: push 接收到的消息是string类型,当做NSNumber类型处理。
4. 数组取值越界crash
5. 关注新技术
(1)苹果热修复crash
(2)ios10以后push使用UNUserNotificationCenter注册push,否则ios10、ios11都有可能crash。
6. 数据竞争带来的crash (SIGSEGV)
例1:NSMutableDictionary类型用objectForKey取数据和setValue: forKey:设置数据,有可能存在数据竞争,需要做保护。
例2: NSMutableArray存在同样的问题。遍历数组期间,不要对数组进行remove和insert操作,因为数组有保护机制,容易崩溃。可以先拷贝一份出来,对拷贝的数组遍历,对真正需要改变的数组操作。
7. selector不存在带来的crash (SIGSEGV)
[self respondsToSelector:@sel(aSel)]的判断,否则有可能带来的unrecognized selector crash。
例1. [toggle addTarget:target action:selector forControlEvents:UIControlEventValueChanged]; // selector是否存在
例2. [self performSelector:@selector(aSelector)]; // aSelector是否存在
参考《Baymax:网易iOS App运行时Crash自动防护实践》,并进行了一些调研和实践,对以下5种常见crash进行了分析,并写出了对应的防护代码。写好的代码已经过初步测试。前进的一小步,记录下来。对应的4篇博客:
标签:好的 网络层 修复 访问 mutable toast 总线 table set
原文地址:http://www.cnblogs.com/Xylophone/p/7429373.html