iOS-39-内存泄漏的检测方式
2017-05-18 本文已影响23人
小东门儿
1.静态分析
使用XCode分析功能,Product->Analyze
使用静态检测可以检查出一些明显的没有释放的内存,包括NSObject和CF开头的内存泄漏,最常见问题有2种,这些问题都不复杂,需要的是细心:
MRC的文件,经常遗漏release或者autorelease。
C方式申请的内存,忘记释放了。
//1
static inline NSString* iphone_device_info(){
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = (char*)malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
...
}
//2
if (alpha != 1) {
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGColorRef color = CGColorCreate(colorSpaceRef, (CGFloat[]){255, 255, 255, 0.3});
[btn.layer setBorderColor:color];
}
不过在修改时应该注意:
这些场景是否真的泄漏了,以免重复释放。
注意该文件是MRC还是ARC,需要不同的内存处理方式。
如果是C申请的内存,注意new delete, malloc free的配对处理。
比如我们的代码中会遇到这样的问题。
if ([self.itemOutput hasNewPixelBufferForItemTime:currentTime]) {
[self displayPixelBuffer:[self.itemOutput copyPixelBufferForItemTime:currentTime itemTimeForDisplay:NULL]];
[_program useGlProgram];
}
进行静态检测时会报copyPixelBufferForItemTime内存泄漏,copy后的对象需要进行释放,可事实上,在“displayPixelBuffer”函数中已经对传入对内存进行了释放,我们姑且不论这样对写法是否合理,只是切记在修改时注意结合上下文处理需要释放的内存。
2.动态检测 使用instruments
在Allocation中我们主要关注的是Persistent和Persistent Bytes,分别表示当前时间段,申请了但是还没释放的内存数量和大小。
记住当前这两个值,然后进入某个新页面,退出该页面,观察这两个值是否增加。需要注意的是,由于有些图片调用本身是有缓存的,如果是用SDWebImage管理,则网络图片都会缓存在内存中。因此退出页面后内存有增加是正常的,而且还有些单例的内存也是不会释放的,我们可以再次进入同一个页面,在图片都加载过的情况下,反复进入退出查看内存状况,如果持续增加,则说明有泄漏。