【问题标题】:Swift UIImage .jpegData memory leak issue [duplicate]Swift UIImage .jpegData 内存泄漏问题[重复]
【发布时间】:2021-03-31 04:42:40
【问题描述】:

我有一些代码可以接受 UIImage 并将该图像保存到磁盘。此代码针对多个图像进行迭代。我注意到,每次代码运行时,都会出现内存泄漏,直到视图被删除。

我将问题追踪到以下行: var data = image.jpegData(compressionQuality: 0.8 )

每次调用此行时,都会为压缩图像分配相应的内存量(每次约 10 Mb),并且在视图关闭之前不会释放。我什至还尝试删除任何对数据的使用(即引用计数应该为 0),但它仍然没有释放内存。

    func save_to_folder( tray_number: Int64, tray_type: String, image: UIImage, filename: String ) -> Bool {
        let dir = self.directory!
            .appendingPathComponent( "trays" )
            .appendingPathComponent( String( format: "tray_%04d", tray_number ) )
            .appendingPathComponent( tray_type )
        
        print( "  save_dir: \( dir.path )" )
        
        let full_filename = dir.appendingPathComponent( filename ).appendingPathExtension( "JPG" )
        print( "  full_filename: \( full_filename.path )" )
        
        do {
            try FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true, attributes: nil )
        }
        catch let error {
            print( "Error creating directory: \( error )" )
            return false
        }
        
        var data = image.jpegData(compressionQuality: 0.8 )
        /*
        do {
            try data!.write(to: full_filename, options: Data.WritingOptions.atomic )
            return true
        }
        catch let error {
            print( "Failed to write file: \( error )" )
        }
        
        data = nil
 */
        return false
    }
for itt in 0...self.URLs.count - 1{
                let closure = { [weak self] in
                    print(self!.URLs[itt])
                    let image = UIImage.init(contentsOfFile: self!.URLs[itt].relativePath)
                    //temp_bore = try! Borehole(sqlite_filename:self!.borehole!.filename)
                    let _ = self?.borehole?.save_to_folder(tray_number: tray_number, tray_type: tray_type, image: image! )
                    tray_number += 1
                    progress += 1
                    DispatchQueue.main.async {
                        alertView.message = "Adding \( progress ) of \( total )"
                    }
                }
                closure()
            }

有人知道这里发生了什么吗?为什么 jpegData 分配的内存永远不会释放?

【问题讨论】:

  • 显示您所指的迭代部分。
  • 谢谢,我添加了迭代代码。使用的“钻孔”对象也对图像进行了一系列处理。 save_to_folder 是钻孔对象的一部分。
  • 我不知道。尝试使用autoreleasepool。无论如何,closure() 是为了什么?
  • 什么是钻孔?.save_to_folder?
  • 由于内存泄漏,我正在搞乱关闭,试图确认一些事情。钻孔只是我用于所有 SQL 查询的对象,也是我从中调用数据处理函数的对象。还有很多其他调用,但我删除了它们以简化并找到内存泄漏。因此,在这种情况下,您可以将钻孔视为我用来将图像写入磁盘的对象。

标签: swift memory-leaks uiimage uiimagejpegrepresentation


【解决方案1】:

感谢 El Tomato,我找到了解决方案。

如果其他人遇到此问题,请在您的 .jpegData 调用周围添加 autoreleasepool

autoreleasepool{
            let data = image.jpegData(compressionQuality: 0.8 )
    
            do {
                try data!.write(to: full_filename, options: Data.WritingOptions.atomic )
            }
            catch let error {
                print( "Failed to write file: \( error )" )
            }

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多