最近使用Analyzecommand+shift+B
对App进行静态分析,遇到几种情况:
garbage value(垃圾值)
左边操作对象是垃圾值,检查是因为只申明了变量:NSInteger endTime;
赋值是在判断语句中赋值的,存在并没有赋值的情况,只需要赋初值就可以了:
NSInteger endTime = 0;
never read(分配了空闲内存)
这是因为[NSMutableArray array]
初始化分配了内存,而判断语句里面arrayWithArray:
方法也相当于初始化分配了内存,就是把初始化的一个新的可变数组赋值给之前已经初始化过的可变数组,看似没什么大问题,其实存在一个数据源却申请了两块内存的问题,已经造成了内存泄露。
解决问题:
① 去掉之前的初始化,只做申明:
NSMutableArray *defaultImageNames;
NSMutableArray *defaultImages;
② 判断语句里面不使用初始化方法,只添加数组对象:
[defaultImageNames addObjectsFromArray:@[@"cmcc_normal",@"cmcc_normal",@"cmcc_normal",@"cmcc_normal"]];
[defaultImageNames addObjectsFromArray:@[[UIImage imageNamed:@"cmcc_normal"],[UIImage imageNamed:@"cmcc_normal"],[UIImage imageNamed:@"cmcc_normal"],[UIImage imageNamed:@"cmcc_normal"]]];
Null passed to a callee that requires a non-null 1st parameter(Null赋值给非空对象)
这是由于Null赋值给non-null对象。详情参考:会报编译器警告的Xcode 6.3新特性:Nullability Annotations
从上面代码可以看出:由于疏忽,判断语句的else
里面并没有给filePath
赋值,所以才会出现Null。只需赋值给filePath
就好了:
filePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpg",@(self.itemIndex)]];
Potential leak of an object stored into 'XX'(存在潜在的内存泄露)
虽然是在ARC模式下,但不是什么东西都可以释放,例如上述的C-types对象,都需要手动来进行释放,所以上面的问题只需手动释放就可以了:
CFRelease(phoneNumbers);
CFRelease(anFullName);
期间还出现过一次这样的错误:Null pointer argument in call to CFRelease
,意思是空指针参数调用CFRelease,仔细一看原来写错地方了,一定要注意这种情况,特别出现一些循环语句的时候。
至于ARC模式下有哪些是需要手动释放的呢?就我所知,CoreFoundation
对象有时候需要CFRelease
,malloc/calloc
等有时候需要free
,还有标准IO fopen
之类的需要fclose
。