ios菜鸟收集区

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管理,则网络图片都会缓存在内存中。因此退出页面后内存有增加是正常的,而且还有些单例的内存也是不会释放的,我们可以再次进入同一个页面,在图片都加载过的情况下,反复进入退出查看内存状况,如果持续增加,则说明有泄漏。

上一篇 下一篇

猜你喜欢

热点阅读