Swift 中 ALAssetRepresentation CGImage 的内存泄漏

Posted

技术标签:

【中文标题】Swift 中 ALAssetRepresentation CGImage 的内存泄漏【英文标题】:Memory leak from ALAssetRepresentation CGImage in Swift 【发布时间】:2015-02-21 06:20:12 【问题描述】:

我正在从我的 UITableView 中的资产加载图像,我注意到我遇到了与从 defaultAssetRepresentation.fullResolutionImage.CGImage.takeunretainedValue 加载的 CGImage 相关的内存泄漏。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(kReviewDisplayCell, forIndexPath: indexPath) as ReviewDisplayCollectionViewCell
    let asset = assets.objectAtIndex(indexPath.row) as ALAsset
    var cgImage = asset.defaultRepresentation().fullResolutionImage().takeUnretainedValue()
    var orientation:UIImageOrientation?
    var orientationValue:NSNumber = asset.valueForProperty(ALAssetPropertyOrientation) as NSNumber
    orientation  = self.correctOrientation(orientationValue)
    var image = UIImage(CGImage: cgImage, scale: 0.5, orientation: orientation!)
    cell.imageView.image = image

    return cell

根据内存泄漏工具,泄漏似乎与: NSPathStore2 对象。 负责框架:+[NSPathStore2 pathStoreWithCharacters:Length:]

上面的函数在堆栈的早期被调用: -[ALAssetRepresentation _fileDescriptor] 然后 -[PLGateKeeperClient fileDescriptorForAssetURL:]

抱歉,我没有足够的声誉来发布我的乐器屏幕截图。

在分配工具上,即使在视图控制器被导航控件关闭之后,UITableViewController 也始终保留 CGImage,我无法确定是否从某个地方强烈引用了它。有没有办法在使用 ARC 时手动释放 CGImage 参考?我尝试将上面的代码放在 autoreleasepoool 中,但它不起作用。预先感谢您的帮助。

【问题讨论】:

【参考方案1】:

对于那些仍然没有找到他们正在寻找的东西,并且偶然发现这个问题的人,使用 CGImage 需要用 autorelease 包装,可能是这样的:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(kReviewDisplayCell, forIndexPath: indexPath) as ReviewDisplayCollectionViewCell
    let asset = assets.objectAtIndex(indexPath.row) as ALAsset
    autoreleasepool 
        var cgImage = asset.defaultRepresentation().fullResolutionImage().takeUnretainedValue()
        var orientation:UIImageOrientation?
        var orientationValue:NSNumber = asset.valueForProperty(ALAssetPropertyOrientation) as NSNumber
        orientation  = self.correctOrientation(orientationValue)
        var image = UIImage(CGImage: cgImage, scale: 0.5, orientation: orientation!)
        cell.imageView.image = image
       
    return cell

见this answer for details。

【讨论】:

很好的答案!但是,我无法将其编辑为“autoreleasepool”,因为该编辑低于 *** 的 6 个字符限制。

以上是关于Swift 中 ALAssetRepresentation CGImage 的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

swift中数组操作

iOS开发中OC和swift的对比

将 Swift 3 升级到 4,目标 c 中不再有 swift 扩展

在 Swift 项目中使用 Objective C 类中的 Swift 类

在 Swift 项目中使用 Objective C 类中的 Swift 类

swift swift中字符串中字符的迭代器