Tencent / LKImageKit

A high-performance image framework, including a series of capabilities such as image views, image downloader, memory caches, disk caches, image decoders and image processors.
Other
2.08k stars 287 forks source link

progress图片加载会出现线程锁和内存泄漏 #14

Closed YangKa closed 6 years ago

YangKa commented 6 years ago

工具:XCode 9.0 模拟器:iOS11.0 iPhone 8 plus

步骤: 1.打开Demo,点击清理缓存 2.进入自定义属性页面,打开Progresive开关,点击大图 big.jpg 结果:大部分情况会出现crash的情况

问题推测:多线程导致的问题

初步分析:

  1. LKImageRequest对象isDecodingprogress属性存在data race现象 2.LKImageSystemDecoder对象中对图片数据渐进式解码成CGImageRef的过程会出现BAD_ACCESS

    问题行代码: else if (count == 1){
    CGImageRef imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, option);

kelingjie1 commented 6 years ago

我看下这个问题

kelingjie1 commented 6 years ago

应该是渐进式加载过程中下载线程和解码线程同时访问一个NSData导致的。最近项目版本发布,比较忙,稍后会修复。

kelingjie1 commented 6 years ago

虽然我这没有出现badaccess。但是问题是已经修复了,可以再试试。 NSMutableData由于不断被下载线程写入,解码的时候会出现线程问题。改为用NSData包装一下已经下载的部分Data,无需额外复制内存,NSData本身也不会被改变,从而解决这个问题。 DataRace问题我整体梳理了一下,把几个有data race的property都加上了线程安全的保护