替换UIImage时的iOS内存泄漏

zbwhf8kr  于 2023-05-30  发布在  iOS
关注(0)|答案(1)|浏览(125)

我已经写了一个小的iOS应用程序,它可以根据存储在Documents目录(在Files下)中的图像创建幻灯片。
它工作正常,但我 * 认为 * 它正在泄漏内存。我这样说的原因是因为在运行它时,我看到每次替换图像时XCode中的内存都会增加。
不是很复杂。我有:

override func viewDidLoad() {
        super.viewDidLoad()
        
        self.imageView.contentMode = .scaleAspectFill
        self.imageView.frame = CGRect(
            x: 0,
            y: 0,
            width: self.bounds.size.width,
            height: self.bounds.size.height
        )
        
        view.addSubview(self.imageView)
        
        /* Loads the filenames of the images */
        loadImages()
        
        displayNext()
         
        Timer.scheduledTimer(
            timeInterval: self.cycleSeconds,
            target: self,
            selector: #selector(displayNext),
            userInfo: nil,
            repeats: true
        )
    }

    @objc
    func displayNext() {
        let imageURL = self.documentsURL.appendingPathComponent(self.imageNames[self.imageIndices[self.i]])
        
        replaceImage(with: imageURL)
        
        if self.i + 1 == self.imageNames.count {
            shuffleImageIndices()
            self.i = 0
        } else {
            self.i = self.i + 1
        }
    }

代码displayNext()最终调用下面的代码来转换到下一个图像:

func replaceImage(with imageURL: URL) {
        assert(imageURL.isFileURL)
        
        let nextImage = UIImage(named: imageURL.path)

        UIView.transition(
            with: self.imageView,
            duration: 0.1,
            options: .transitionCrossDissolve,
            animations: { self.imageView.image = nextImage },
            completion: nil
        )
    }

不知何故,所有这些都泄漏了内存,我似乎不知道如何摆脱它。

6fe3ivhb

6fe3ivhb1#

Image(named:)缓存图像。因此,您很可能会看到由于该高速缓存的内存消耗而导致的内存增加。检查documentation
你应该使用UIImage(contentsOfFile:)的构造函数。

讨论:

使用缓存版本没有任何问题。图像将被缓存,这将提高性能,但可能会消耗更多内存。这不是内存泄漏,而是预期行为。该高速缓存本身不会因内存消耗而导致应用崩溃,它会在使用大量内存时清除缓存,内存消耗会下降。

相关问题