ios - 从画廊获取图像到我的应用程序时内存泄漏

标签 ios swift memory-leaks phasset

我有这个功能。此函数初始化画廊 View 的所有媒体文件。

func initMediaFiles() {
    var assets: [PHAsset] = []
    let options = PHFetchOptions()
    options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

options.fetchLimit = 1000
    let results = PHAsset.fetchAssets(with: .image, options: options)
    results.enumerateObjects({ (object, _, _) in
        if let asset = object as? PHAsset {
            assets.append(asset)

        }
    })        
 SCPAsset.imageManager.startCachingImages(for: assets, targetSize: CGSize(width: 110.0, height: 147.0),contentMode: .aspectFill,  options: nil)
    for asset in assets {
        let scpAsset = SCPAsset(initWithPHAsset: asset)
        scpAsset.inspectionUUID = self.inspectionId!
        self.mediaAssets.append(scpAsset)
    }

}

我不明白为什么我每次加载图库 View 时都会发生 10,000 次内存泄漏。

最佳答案

以下是我在一个项目中所做的可能有帮助的事情:

一些属性:

 let requestOptions = PHImageRequestOptions()
    let fetchOptions = PHFetchOptions()
    let cachingImageManager = PHCachingImageManager()
    var assets: [PHAsset] = [] {
        willSet {
            cachingImageManager.stopCachingImagesForAllAssets()
        }

        didSet {
            cachingImageManager.startCachingImagesForAssets(assets,
                targetSize: PHImageManagerMaximumSize,
                contentMode: .AspectFit,
                options: self.requestOptions
            )
        }
    }


    func fetchPhotos() {
        requestOptions.resizeMode = PHImageRequestOptionsResizeMode.Exact
        requestOptions.version = .Current
        requestOptions.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat
        requestOptions.synchronous = true

        fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)]
        if #available(iOS 9.0, *) {
            fetchOptions.fetchLimit = 50
        } else {

            // Fallback on earlier versions
        }

        fetchResults = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)
        guard let fetchResults = fetchResults else {
            print("No PHAssets")
            return
        }
        dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) { [weak self] in
            fetchResults.enumerateObjectsUsingBlock{ object, index, stop in
                let asset = object as! PHAsset
                self?.assets.append(asset)
            }
            dispatch_async(dispatch_get_main_queue()) {
                self?.photoCollectionView.reloadData()
            }
        }
    }

关于ios - 从画廊获取图像到我的应用程序时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767836/

相关文章:

ios - UIViewController 变量在解除分配后仍然存在

ios - 在单个应用程序中使用多个 Firebase 数据库 - Swift

ios - 自升级到 iOS 13.0 以来 AppDelegate 中的无限循环

swift - Vapor 服务器触发的进程返回空字符串

objective-c - 如何从 Objective-C 调用 Swift 可变参数方法?

python - 在 Google App Engine (python) 中从 Google Cloud Storage 读取文件时出现内存泄漏

javascript - 下面的 setTimeout JavaScript 代码是否泄漏?

iphone - 在 iOS 上停止自动关闭键盘/禁用 AutomaticKeyboardDismissal 未调用

ios - 由于自动布局,在 UILabel 中获取换行符

python - Keras/Tensorflow疑似内存泄漏