我正在从 UITableView 中的 Assets 加载图像,我注意到我从 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:]
我很抱歉我没有足够的声誉来发布我的乐器屏幕截图。

在分配工具上,即使在 View Controller 被导航控件解除之后, UITableViewController 始终保留了 CGImage ,我无法确定是否从某个地方对它进行了强引用。有没有办法在使用 ARC 时手动释放 CGImage 引用?我尝试将上述代码放在 autoreleasepoool{} 中,但没有奏效。预先感谢您的帮助。

最佳答案

对于那些还没有找到他们要找的东西并偶然发现这个问题的人来说,使用 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

关于ios - Swift 中 ALAssetRepresentation CGImage 的内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27614746/

10-13 01:20