码迷,mamicode.com
首页 > 其他好文 > 详细

Crash小结

时间:2017-08-25 19:22:55      阅读:680      评论:0      收藏:0      [点我收藏+]

标签:好的   网络层   修复   访问   mutable   toast   总线   table   set   

一、常见crash名词解释

SIGSEGV

一般情况下,SIGSEGV是由于内存地址不合法造成。因为无效的内存访问导致的,一般是指针指向不存在的地址所导致(Invalid memory reference);

SIGBUS

一般情况下,SIGBUS是因为内存地址没有对齐导致。

因为总线出错(bus error)。地址一般是先校验地址对齐再校验其他的,校验地址对齐后会放入数据总线,这时有问题就会报SIGBUS的错误。

SIGABRT

异常终止条件,例如abort()。

二、常见crash分类整理

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则crash8if(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取数据和setValueforKey:设置数据,有可能存在数据竞争,需要做保护。

  例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是否存在

三、crash防护

参考《Baymax:网易iOS App运行时Crash自动防护实践》,并进行了一些调研和实践,对以下5种常见crash进行了分析,并写出了对应的防护代码。写好的代码已经过初步测试。前进的一小步,记录下来。对应的4篇博客:

  1.  [crash详解与防护] unrecognized selector crash
  2.  [crash详解与防护] Container类型的crash和NSString类型的crash

  3.  [crash详解与防护] NSTimer crash

  4.  [crash详解与防护] NSNotification crash

 

Crash小结

标签:好的   网络层   修复   访问   mutable   toast   总线   table   set   

原文地址:http://www.cnblogs.com/Xylophone/p/7429373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!