美文网首页
iOS内存问题分析

iOS内存问题分析

作者: michaelJackDong | 来源:发表于2020-03-30 10:26 被阅读0次

    内存方面常见问题:
    1、UIGraphicsEndImageContext
    UIGraphicsBeginImageContext和UIGraphicsEndImageContext必须成双出现,不然会造成context泄漏。另外XCode的Analyze也能扫出这类问题。
    2、UIWebView
    无论是打开网页,还是执行一段简单的js代码,UIWebView都会占用APP大量内存。而WKWebView不仅有出色的渲染性能,而且它有自己独立进程,一些网页相关的内存消耗移到自身进程里,最适合取替UIWebView。不过目前苹果已经强制iOS开发者使用WKWebView
    3、autoreleasepool
    通常autoreleased对象是在runloop结束时才释放。如果在循环里产生大量autoreleased对象,内存峰值会猛涨,甚至出现OOM。适当的添加autoreleasepool能及时释放内存,降低峰值。
    4、互相引用
    比较容易出现互相引用的地方是block里使用了self,而self又持有这个block,只能通过代码规范来避免。另外NSTimer的target、CAAnimation的delegate,是对Obj强引用。使用的时候要注意。
    5、大图片处理
    举个例子一般图片缩放接口是这样写的:

    • (UIImage)scaleImage:(UIImage)image newSize:(CGSize)newSize {
      UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
      [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
      UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      return newImage;
      }
      但处理大分辨率图片时,往往容易出现,原因是-[UIImage drawInRect:]在绘制时,先解码图片,再生成原始分辨率大小的bitmap,这是很耗内存的。解决方法是使用更低层的ImageIO接口,避免中间bitmap产生:
    • (UIImage)scaleImageWithData:(NSData)data withSize:(CGSize)size scale:(CGFloat)scale orientation:(UIImageOrientation)orientation {
      CGFloat maxPixelSize = MAX(size.width, size.height);
      CGImageSourceRef ref = CGImageSourceCreateWithData((__bridge CFDataRef)data, nil);
      NSDictionary *options = @{(__bridge id)kCGImageSourceCreateThumbnailFromImageAlways:(__bridge id)kCFBooleanTrue,(__bridge id)kCGImageSourceThumbnailMaxPixelSize:[NSNumber numberWithFloat:maxPixelSize]};
      CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(ref, 0, (__bridge CFDictionaryRef)options);
      UIImage *resultImage = [UIImage imageWithCGImage:imageRef scale:scale orientation:orientation];
      CGImageRelease(imageRef);
      CFRelease(ref);
      return resultImage;
      }
      6、大视图
      大视图是指View的size过大,自身包含要渲染的内容。比如微信里常见的炸群消息,通常几千甚至几万行。如果把它绘制到同一个View里,那将会消耗大量内存,同时造成严重卡顿。最好做法是把文本划分成多个View绘制,利用TableView的复用机制,减少不必要的渲染和内存占用。

    相关文章

      网友评论

          本文标题:iOS内存问题分析

          本文链接:https://www.haomeiwen.com/subject/toymuhtx.html