这是出自一位群友所得来的经验。 当然 还有很多情况,大家要及时分享和交流啊,众人拾柴火焰高啊。
卡顿一般是列表滑动时候加载耗费时间,比如计算高度,加载非内存区图片等,占用时间久了就感觉卡顿,如果崩溃可能是本身就有问题,数组越界之类的,或者内存太大,没有及时释放导致的,还是要看报错信息再做相应处理 ....
为了减少程序崩溃的几率,需要对特定的代码设置一些保护性质的纠错措施。本文记录了几种需要保护的情况。
下面是俊哥总结出来的一些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;
|
感谢苏苏提供推荐使用 :
DurexKit安全工具包(最好在github上下载源码,代码更新比较快)
介绍:
解决iOS因原生方法抛出的异常引起的程序闪退问题。
原理:
使用Category,参数经过判断后才能执行方法,再将原生抛异常的方法替换,所以不需要修改任何已有的代码,仅import工具包的头文件,即可解决部分异常问题。
1、NSArray、NSDictionary、NSString、KVC等问题引起的闪退。
2、解决NSObject performSelector找不到selector引起的闪退。
开发者说:希望大家一起完善这份代码,添加更多的异常情况。
小编注:感谢开发者@CUSLayout 发布代码于Code4App.com。
测试环境:
[Code4App]编译测试,测试环境:Xcode 5.0, iOS 7.0 以上。
效果图:
使用方法:
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