2016-10-14 5 views
1

私は、カメラロールから写真をアップロードするためのアプリを開発中です。アップロードの一環として、写真のMD5を計算する必要があります(アップロードする前に重複を確認する必要があります)。現在、アプリはmallocエラーのため頻繁にクラッシュします。IOS - ローカルイメージのMD5を生成するときにメモリが枯渇しました

問題を追跡するために、私はデバイス上のすべての写真のMD5を生成するだけの簡単なテストプログラムを作成しました。このプログラムも同様にクラッシュします。

私が使用しているコードは以下の通りです:

class ViewController: UIViewController { 

@IBOutlet weak var numberOfPhotos: UILabel! 
let imageManager = PHImageManager.default() 
lazy var imageRequestOptions : PHImageRequestOptions = { 
    var options = PHImageRequestOptions() 
    options.isSynchronous = false 
    options.deliveryMode = .highQualityFormat 
    return options 
}() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let collection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary, options: nil).firstObject 
    let options = PHFetchOptions() 
    options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) 

    let allImages = PHAsset.fetchAssets(in: collection!, options: options) 


    allImages.enumerateObjects({ 
     asset, index, stop in 
     self.imageManager.requestImageData(for: asset , options: self.imageRequestOptions, resultHandler: { 
      imageData,dataUTI,orientation,info in 
      if imageData != nil { 
        let digestLength = Int(CC_MD5_DIGEST_LENGTH) 
        var md5Buffer = [UInt8](repeating: 0, count: digestLength) 

        let _ = imageData!.withUnsafeBytes { (body: UnsafePointer<UInt8>) in 
         CC_MD5(body, CC_LONG(imageData!.count), &md5Buffer) 
        } 

      } 
     }) 

    }) 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
このプログラムは次のエラーで失敗する前に、約50の写真を処理します

2016-10-14 15:51:41.565468 PhotoLoadTest[3513:804150] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** NSAllocateMemoryPages(7679134) failed' 
*** First throw call stack: 
(0x1910101c0 0x18fa4855c 0x191010108 0x191a6265c 0x191a38ac8 0x191a03404 0x100720fa8 0x1006c31f8 0x100015a38 0x19c77e930 0x10098525c 0x10098521c 0x10098a284 0x190fbdf2c 0x190fbbb18 0x190eea048 0x19296d198 0x196ec3818 0x196ebe550 0x100017ca8 0x18fecc5b8) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

私が見インスツルメンツによるプログラムを実行していますプログラムがクラッシュする前に永続メモリの使用量が1.6 GBに上昇することを示します。このプログラムは、メモリをリークどこ

私はプログラムが正常に動作しますCC_MD5への呼び出しをコメントアウトした場合

...

は、私はすぐに表示されません。このクラッシュがなぜ起こるかあなたは何か考えがありますか?

答えて

0
autoreleasepool{ 
allImages.enumerateObjects({ 
     asset, index, stop in 
     self.imageManager.requestImageData(for: asset , options: self.imageRequestOptions, resultHandler: { 
      imageData,dataUTI,orientation,info in 
      if imageData != nil { 
        let digestLength = Int(CC_MD5_DIGEST_LENGTH) 
        var md5Buffer = [UInt8](repeating: 0, count: digestLength) 

        let _ = imageData!.withUnsafeBytes { (body: UnsafePointer<UInt8>) in 
         CC_MD5(body, CC_LONG(imageData!.count), &md5Buffer) 
        } 

      } 
     }) 

    }) 

} 

上記のコードは、すべてのイメージの自動解放プールがメモリ管理を担当するため、反復処理中に機能する場合があります。

関連する問題