[![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/chenfanfang/AvoidCrash) [![pod](https://img.shields.io/badge/pod-2.3.0--beta-yellow.svg)](https://github.com/chenfanfang/AvoidCrash) [![platform](https://img.shields.io/badge/platform-iOS-ff69b4.svg)](https://github.com/chenfanfang/AvoidCrash) [![aboutme](https://img.shields.io/badge/about%20me-chenfanfang-blue.svg)](http://www.jianshu.com/users/80fadb71940d/latest_articles)
前言
===
一个已经发布到AppStore上的App,最忌讳的就是崩溃问题。为什么在开发阶段或者测试阶段都不会崩溃,而发布到AppStore上就崩溃了呢?究其根源,最主要的原因就是数据的错乱。特别是 服务器返回数据的错乱,将严重影响到我们的App。
---
Foundation框架存在许多潜在崩溃的危险
===
- 将 nil 插入可变数组中会导致崩溃。
- 数组越界会导致崩溃。
- 根据key给字典某个元素重新赋值时,若key为 nil 会导致崩溃。
- ......
---
AvoidCrash简介
===
- 这个框架利用runtime技术对一些常用并且容易导致崩溃的方法进行处理,可以有效的防止崩溃。
- 并且打印出具体是哪个方法会导致崩溃,让你快速定位导致崩溃的代码。
- 你可以获取到原本导致崩溃的主要信息<由于这个框架的存在,并不会崩溃>,进行相应的处理。比如:
- 你可以将这些崩溃信息发送到自己服务器。
- 你若集成了第三方崩溃日志收集的SDK,比如你用了腾讯的Bugly,你可以上报自定义异常。
- 或许你会问就算防止了崩溃,但是所获取到的数据变成nil或者并非是你所需要的数据,这又有什么用?对于防止崩溃,我的理解是,宁愿一个功能不能用,都要让app活着,至少其他功能还能用。
---
下面先来看下防止崩溃的效果吧
===
`可导致崩溃的代码`
```
NSString *nilStr = nil;
NSArray *array = @[@"chenfanfang", nilStr];
```
- 若没有AvoidCrash来防止崩溃,则会直接崩溃,如下图
![崩溃截图.png](https://raw.githubusercontent.com/chenfanfang/AvoidCrash/66b631627443490776f964d5f6cdc0d9215d7b09/AvoidCrashDemo/Screenshot/%E5%B4%A9%E6%BA%83%E6%88%AA%E5%9B%BE.png)
- 若有AvoidCrash来防止崩溃,则不会崩溃,并且会将原本会崩溃情况的详细信息打印出来,如下图
![防止崩溃输出日志.png](https://raw.githubusercontent.com/chenfanfang/AvoidCrash/66b631627443490776f964d5f6cdc0d9215d7b09/AvoidCrashDemo/Screenshot/%E9%98%B2%E6%AD%A2%E5%B4%A9%E6%BA%83%E7%9A%84%E8%BE%93%E5%87%BA%E6%97%A5%E5%BF%97.png)
---
## Installation【安装】
### From CocoaPods【使用CocoaPods】
```ruby
pod 'AvoidCrash', '~> 2.3.0-beta'
```
### Manually【手动导入】
- Drag all source files under floder `AvoidCrash` to your project.【将`AvoidCrash`文件夹中的所有源代码拽入项目中】
- 对 NSMutableArray+AvoidCrash.m 文件进行 -fno-objc-arc 设置(若使用CocoaPods集成则无需手动配置),配置过程如下图:
![](https://raw.githubusercontent.com/chenfanfang/AvoidCrash/e955af927c5ed57f783a71eaca19cb3f028377d0/AvoidCrashDemo/Screenshot/%E9%85%8D%E7%BD%AEmutableArray.png)
---
使用方法
===
- AvoidCrash使用注意点讲解
```
//让AvoidCrash生效方法有两个becomeEffective和makeAllEffective,若都不调用,则AvoidCrash就不起作用
[AvoidCrash becomeEffective]; //【默认不开启 对”unrecognized selector sent to instance”防止崩溃的处理】
//若要开启对对”unrecognized selector sent to instance”防止崩溃的处理】,请使用
//[AvoidCrash makeAllEffective],使用注意点,请看AvoidCrash.h中的描述,必须配合[AvoidCrash setupNoneSelClassStringsArr:]的使用
//【建议在didFinishLaunchingWithOptions最初始位置调用】[AvoidCrash makeAllEffective]
/*
[AvoidCrash becomeEffective]和[AvoidCrash makeAllEffective]是全局生效。若你只需要部分生效,你可以单个进行处理,比如:
[NSArray avoidCrashExchangeMethod];
[NSMutableArray avoidCrashExchangeMethod];
.................
.................
*/
```
- 在AppDelegate的didFinishLaunchingWithOptions方法中的最初始位置添加如下代码,让AvoidCrash生效
```
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//启动防止崩溃功能(注意区分becomeEffective和makeAllEffective的区别)
//具体区别请看 AvoidCrash.h中的描述
//建议在didFinishLaunchingWithOptions最初始位置调用 上面的方法
[AvoidCrash makeAllEffective];
//若出现unrecognized selector sent to instance导致的崩溃并且控制台输出:
//-[__NSCFConstantString initWithName:age:height:weight:]: unrecognized selector sent to instance
//你可以将@"__NSCFConstantString"添加到如下数组中,当然,你也可以将它的父类添加到下面数组中
//比如,对于部分字符串,继承关系如下
//__NSCFConstantString --> __NSCFString --> NSMutableString --> NSString
//你可以将上面四个类随意一个添加到下面的数组中,建议直接填入 NSString
NSArray *noneSelClassStrings = @[
@"NSString"
];
[AvoidCrash setupNoneSelClassStringsArr:noneSelClassStrings];
//监听通知:AvoidCrashNotification, 获取AvoidCrash捕获的崩溃日志的详细信息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealwithCrashMessage:) name:AvoidCrashNotification object:nil];
return YES;
}
```
- 若你想要获取崩溃日志的所有详细信息,只需添加通知的监听,监听的通知名为:AvoidCrashNotification
```
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[AvoidCrash becomeEffective];
//监听通知:AvoidCrashNotification, 获取AvoidCrash捕获的崩溃日志的详细信息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealwithCrashMessage:) name:AvoidCrashNotification object:nil];
return YES;
}
- (void)dealwithCrashMessage:(NSNotification *)note {
//注意:所有的信息都在userInfo中
//你可以在这里收集相应的崩溃信息进行相应的处理(比如传到自己服务器)
NSLog(@"%@",note.userInfo);
}
```
- 下面通过打断点的形式来看下userInfo中的信息结构,看下包含了哪些信息
![userInfo信息结构.png](https://raw.githubusercontent.com/chenfanfang/AvoidCrash/66b631627443490776f964d5f6cdc0d9215d7b09/AvoidCrashDemo/Screenshot/userInfo%E4%BF%A1%E6%81%AF%E7%BB%93%E6%9E%84.png)
- 再看下控制台输出日志来看下userInfo中的包含了哪些信息
![userInfo详细信息](https://raw.githubusercontent.com/chenfanfang/AvoidCrash/556cab1b9fa25c8265dd1e8a19c816db20e93c24/AvoidCrashDemo/Screenshot/userInfo%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF.png)
---
目前可以防止崩溃的方法有
===
---
- unrecognized selector sent to instance
- `1. 对”unrecognized selector sent to instance”防止崩溃的处理`
---
- NSArray
- `1. NSArray的快速创建方式 NSArray *array = @[@"chenfanfang", @"AvoidCrash"]; //这种创建方式其实调用的是2中的方法`
- `2. +(instancetype)arrayWithObjects:(const id _Nonnull __unsafe_unretained *)objects count:(NSUInteger)cnt`
- `3. 通过下标获取元素 array[100]、[array objectAtIndex:100]`
- `- (id)objectAtIndex:(NSUInteger)index`
- `4. - (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes`
- `5. - (void)getObjects:(__unsafe_unretained id _Nonnull *)objects range:(NSRange)range`
---
- NSMutableArray
- `1. 通过下标获取元素 array[100]、[array obje
没有合适的资源?快使用搜索试试~ 我知道了~
iOS 拦截奔溃 使程序不在崩溃
共57个文件
m:17个
h:15个
png:6个
需积分: 50 21 下载量 186 浏览量
2017-11-16
04:20:33
上传
评论 1
收藏 1.27MB ZIP 举报
温馨提示
iOS 拦截奔溃 使程序不在崩溃 使用Runloop起死回生 拦截崩溃信息 传到服务器
资源详情
资源评论
资源推荐
收起资源包目录
AvoidCrash-master.zip (57个子文件)
AvoidCrash-master
AvoidCrashDemo
AvoidCrashDemo
ViewController.m 12KB
Info.plist 1KB
main.m 337B
Base.lproj
LaunchScreen.storyboard 2KB
Main.storyboard 2KB
ViewController.h 245B
AppDelegate.h 307B
Person.m 347B
Person.h 527B
Assets.xcassets
AppIcon.appiconset
Contents.json 1KB
AppDelegate.m 3KB
.DS_Store 6KB
Screenshot
userInfo信息结构.png 186KB
防止崩溃的输出日志.png 150KB
platform.svg 737B
崩溃截图.png 285KB
配置mutableArray.png 181KB
MIT.svg 735B
userInfo详细信息.png 326KB
Leaks.png 127KB
AvoidCrashDemoUITests
Info.plist 733B
AvoidCrashDemoUITests.m 1KB
AvoidCrashDemo.xcodeproj
project.xcworkspace
contents.xcworkspacedata 159B
xcuserdata
mengxianzhi.xcuserdatad
UserInterfaceState.xcuserstate 21KB
xcuserdata
mengxianzhi.xcuserdatad
xcdebugger
Breakpoints_v2.xcbkptlist 785B
xcschemes
xcschememanagement.plist 337B
project.pbxproj 30KB
AvoidCrashDemoTests
Info.plist 733B
AvoidCrashDemoTests.m 923B
.DS_Store 6KB
AvoidCrash
NSObject+AvoidCrash.m 6KB
NSMutableString+AvoidCrash.h 682B
NSDictionary+AvoidCrash.m 2KB
NSString+AvoidCrash.h 960B
NSMutableDictionary+AvoidCrash.m 2KB
NSAttributedString+AvoidCrash.h 595B
NSMutableAttributedString+AvoidCrash.m 2KB
NSMutableArray+AvoidCrash.m 4KB
NSObject+AvoidCrash.h 912B
NSArray+AvoidCrash.m 8KB
NSMutableDictionary+AvoidCrash.h 471B
AvoidCrashStubProxy.m 288B
NSMutableString+AvoidCrash.m 3KB
NSString+AvoidCrash.m 7KB
AvoidCrash.h 2KB
NSMutableArray+AvoidCrash.h 674B
AvoidCrash.m 7KB
AvoidCrashProtocol.h 307B
NSArray+AvoidCrash.h 727B
NSAttributedString+AvoidCrash.m 3KB
NSMutableAttributedString+AvoidCrash.h 527B
AvoidCrashStubProxy.h 929B
NSDictionary+AvoidCrash.h 678B
LICENSE 1KB
README.md 14KB
.gitignore 1KB
AvoidCrash.podspec 1KB
共 57 条
- 1
mengxianzhivip
- 粉丝: 5
- 资源: 49
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0