带有图像的“来自调试器的消息:由于内存问题而终止”

时间:2018-09-24 06:34:04

标签: ios swift

我正在尝试从专辑中获取图像,并且此代码从特定专辑中获取所有图像,但是在滚动应用程序上将关闭并给出错误“调试器消息:由于内存问题而终止”。请检查代码并找到错误。(我想获取所有相册和图像,例如“ Lalalab”应用,而不会发出内存警告)。

 func fatchImagesfromAlbum() {
        DispatchQueue.global(qos: .background).async {
        self.photoAssets = self.fetchResult as! PHFetchResult<AnyObject>

        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue)


        self.photoAssets = PHAsset.fetchAssets(in: self.assetCollection, options: fetchOptions) as! PHFetchResult<AnyObject>

        for i in 0..<self.photoAssets.count{
                let asset = self.photoAssets.object(at: i)
                let imageSize = CGSize(width: asset.pixelWidth,
                                       height: asset.pixelHeight)

                let options = PHImageRequestOptions()
                options.deliveryMode = .fastFormat
                options.isSynchronous = true

                self.imageManager.requestImage(for: asset as! PHAsset, targetSize: imageSize, contentMode: .aspectFill, options: options, resultHandler: { (image, info) -> Void in


                    self.images.append(image!)
                    let url:NSURL = info!["PHImageFileURLKey"] as! NSURL
                    let urlString: String = url.path!
                    let theFileName = (urlString as NSString).lastPathComponent
                    print("file name\(info!)")
                    self.imageName.append("\(theFileName)")
                    self.imagePath.append("\(urlString)")

                })

                print(self.imagePath)
                print(self.imageName)
                DispatchQueue.main.async
                    {
                        [unowned self] in

                        self.collectionView.reloadData()
                }


        }
    }
    PHPhotoLibrary.shared().register(self)

    if fetchResult == nil {
        let allPhotosOptions = PHFetchOptions()
        allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
        fetchResult = PHAsset.fetchAssets(with: allPhotosOptions)
    }


    }

2 个答案:

答案 0 :(得分:1)

面对这样的问题;它与进行weakunowned引用无关。通过Objective-C代码或使用Cocoa类创建对象后,您应该做的是处理autoreleasepool,请尝试在autoreleasepool内调用方法:

autoreleasepool {
    fatchImagesfromAlbum()
}

应该是fetchImagesfromAlbum而不是fatchImagesfromAlbum吗?

引用Advanced Memory Management Programming Guide

  

自动释放池块提供了一种您可以放弃的机制   对象的所有权,但要避免成为对象的可能性   立即释放(例如,当您从   方法)。通常,您不需要创建自己的自动发布池   块,但在某些情况下您必须或必须   这样做是有益的。

然而,应该不需要autoreleasepool中执行整个方法,可能是由于执行{{ 1}}或fetchAssets迭代(在requestImage循环内)。


引用:Is it necessary to use autoreleasepool in a Swift program?

答案 1 :(得分:0)

您需要创建一个diapatch组,然后每当运行循环时,输入group并离开。循环完成后,您可以调用diapatch.notify并重新定义您的UI