iOS 检测项目大图

工具地址如下:github.com/wing3501/Bi…

起因

最近发现APP直播间内内存占用峰值非常高。经查是因为聊天列表中,部分用户头像用了原图导致。
APP内存占用过高,会引起OOM。APP处于后台时,当手机内存吃紧的,系统也会优先从内存占用大的APP开始杀。等等等等许多危害。 一般SDWebimage管理的图片缓存会在内存警告时进行释放,但是我们还是应该尽可能合理地去使用图片。一般我们优化图片使用的方式有:

1.使用带尺寸的图片地址 比如 www.xxxx.xxx-W800H800/w/64
2.使用SDWebimage的缩放选项SDWebImageScaleDownLargeImages
3.图片缩放
等等...

前言

尽管小心谨慎,但是业务发展,不知道什么时候代码就会出现纰漏。所以,我写了一个小工具,检测项目的使用大图。个人水平有限,仅供参考。

效果如下

IMG_0968(20211202-191834).PNG

IMG_0969(20211202-192107).PNG

  • 如果是网络图片,则收集图片所在视图信息
  • 如果是本地图片,则收集图片名称或者路径
  • 如果是从NSdata创建的图片,则收集创建图片时堆栈信息

个人思路

@interface UIView (SDBigImageTracker)
- (void)my_sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(id)setImageBlock transition:(id)transition cacheType:(NSInteger)cacheType imageURL:(NSURL *)imageURL;
@end

@interface UIImage (SDBigImageTracker)
+ (nullable UIImage *)my_imageNamed:(NSString *)name;
+ (nullable UIImage *)my_imageNamed:(NSString *)name inBundle:(nullable NSBundle *)bundle withConfiguration:(nullable UIImageConfiguration *)configuration API_AVAILABLE(ios(13.0));
+ (nullable UIImage *)my_imageNamed:(NSString *)name inBundle:(nullable NSBundle *)bundle compatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection;
+ (nullable UIImage *)my_imageWithContentsOfFile:(NSString *)path;
+ (nullable UIImage *)my_imageWithData:(NSData *)data;
+ (nullable UIImage *)my_imageWithData:(NSData *)data scale:(CGFloat)scale;
@end
复制代码

因为项目中,网络图片基本都是使用SDWebimage来加载网络图片。所以我hook了SDWebimage下载完图片解码后设置图片的方法。用于获取图片解码后的大小和所在视图。

针对本地图片,则在UImage创建时,记录图片名称或本地路径。开一个定时器定时去检查图片解码完成没有。

从NSData创建的图片,则获取一下创建堆栈,方便定位所在位置。

猜你喜欢

转载自juejin.im/post/7037076093630677000