iOS 防止崩溃之代码保护注意措施初级剑侠篇(欢迎提建议和分享遇到的问题)


这是出自一位群友所得来的经验。 当然 还有很多情况,大家要及时分享和交流啊,众人拾柴火焰高啊。


卡顿一般是列表滑动时候加载耗费时间,比如计算高度,加载非内存区图片等,占用时间久了就感觉卡顿,如果崩溃可能是本身就有问题,数组越界之类的,或者内存太大,没有及时释放导致的,还是要看报错信息再做相应处理 ....



 为了减少程序崩溃的几率,需要对特定的代码设置一些保护性质的纠错措施。本文记录了几种需要保护的情况。

下面是俊哥总结出来的一些oc语言的代码保护:

1、向容器加对象

      主要指NSMutableArray、NSMutabledictionary。向这两个容器添加nil,会引起崩溃。所以在传入前,需要对传入的内容进行非错判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//错误示范
NSString *addString = nil;
NSMutableArray *mArray = [NSMutableArray array];
[mArray addObject:addString];
 
//建议写法
NSString *addString = nil;
NSMutableArray *mArray = [NSMutableArray array];
if (addString != nil) {
 
  [mArray addObject:addString];
   
}else {
 
  NSLog(@"xx类xx方法试图向数组mArray传入一个nil");
   
}

2、从容器取数据

     主要指NSArray、NSMutableArray。从array里取数据,要注意防止下标数组越界。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//错误示范
NSArray *array = @[@"a", @"b", @"c"];
int index = 5
NSString *testString = array[index];
 
//建议写法
NSArray *array = @[@"a", @"b", @"c"];
int index = 5
 
if (index < array.count) {
 
   NSString *testString = array[index];
 
}else {
 
   NSLog(@"xx类xx方法试图从数组mArray取一个超出count的对象");
}
 
//一般要读取某个动态生成的容器里的内容,需要先对这个容器进行检查
NSArray *array = 动态生成;
if (array != nil && array.count > 0) {
 
   //读取里面的内容
    
}else {
 
   //输出错误信息
}

3、调用其他类的方法或不知道要调用的方法当前SDK版本是否支持。需要先判断一下这个方法是否存在。

1
2
3
4
5
6
7
8
//错误示范
[self.delegate 要调用的方法];
     
//建议写法
if ([self.delegate respondsToSelector:@selector(要调用的方法)]) {
         
        [self.delegate 要调用的方法];
}

4、定义delegate属性的时候,一定要设置为weak。

1
2
3
4
5
//错误示范
@property (nonatomic, assign)  id <MyDelegate> delegate;
 
//建议写法
@property (nonatomic, weak)  id <MyDelegate> delegate;
这里是不是也可以用assign 啊 ?最好用weak吧




感谢苏苏提供推荐使用 : 

DurexKit安全工具包(最好在github上下载源码,代码更新比较快)


介绍:
    解决iOS因原生方法抛出的异常引起的程序闪退问题。 

    原理: 

    使用Category,参数经过判断后才能执行方法,再将原生抛异常的方法替换,所以不需要修改任何已有的代码,仅import工具包的头文件,即可解决部分异常问题。 

    1、NSArray、NSDictionary、NSString、KVC等问题引起的闪退。 

    2、解决NSObject performSelector找不到selector引起的闪退。 

    开发者说:希望大家一起完善这份代码,添加更多的异常情况。 

    小编注:感谢开发者@CUSLayout 发布代码于Code4App.com。

测试环境:
    [Code4App]编译测试,测试环境:Xcode 5.0, iOS 7.0 以上。
效果图:
  • iOS / iPhone / iPad 解决iOS因原生方法抛出的异常引起的程序闪退问题。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;原理:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;使用Category,参数经过判断后才能执行方法,再将原生抛异常的方法替换,所以不需要修改任何已有的代码,仅import工具包的头文件,即可解决部分异常问题。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;1、NSArray、NSDictionary、NSString、KVC等问题引起的闪退。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;2、解决NSObject performSelector找不到selector引起的闪退。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;开发者说:希望大家一起完善这份代码,添加更多的异常情况。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;小编注:感谢开发者@CUSLayout 发布代码于Code4App.com。
使用方法:


1.将文件夹 "DurexKit" 添加到项目中; 
2.#import "DurexKit.h" 
3.无需修改项目中的任何代码。 

exchange the method in NSArray,NSDictionary… 

+ (void) load{ 
    [self swizzleMethod:@selector(SKobjectAtIndex:) targetClass:@"__NSArrayI" target:@selector(objectAtIndex:)]; 
    [self swizzleMethod:@selector(SKarrayByAddingObject:) targetClass:@"__NSArrayI" target:@selector(arrayByAddingObject:)]; 


http://code4app.com/ios/DurexKit安全工具包/5325b421933bf0463d8b49ec



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值