SDWebImage / SDWebImageSwiftUI

SwiftUI Image loading and Animation framework powered by SDWebImage
https://sdwebimage.github.io/SDWebImageSwiftUI
MIT License
2.1k stars 216 forks source link

Potential memory leak with AnimatedImage with a context menu modifier on macOS #253

Open andylin2004 opened 1 year ago

andylin2004 commented 1 year ago

I have a SwiftUI multiplatform project where I have a ScrollView containing a LazyVGrid, which contains a bunch of VStacks containing a AnimatedImages, all of which are given the purgeable(true), pausable(false), resizable(), and scaledToFit() modifier, and a Text. The VStack is given a contextMenu modifier that passes in a text, button, or a combination of the two (the text and/or buttons could be wrapped in a view and the same thing would happen).

On iOS, if I activate the context menu (by long pressing on the VStack), there isn't a spike in RAM use. However, on macOS, if I activate the context menu (by clicking on the VStack with two fingers), the RAM use spikes and never drops down at all, indicating a memory leak issue. I'm not too sure how this is happening, but I have a suspicion that there is something to do with either macOS's implementation of a LazyVGrid or how AnimatedImage is implemented on macOS.

dreampiggy commented 1 year ago

AnimatedImage (actually, it use a UIViewRepresentable SDAnimatedImageView) has a onDisappear clear frame cache behavior on iOS, rely on iOS's UIKit UIView lifecycle. And has a low memory warning to clear frame cache, rely UIApplicationDidReceiveMemoryWarning notification.

This does not works on macOS seems (The onDisappear should be works I think).

But it's not a "leak" in general, if you totally make your LazyGrid disappear, the cache frame should be free.

dreampiggy commented 1 year ago

Can you provide a Xcodeproject demo for me to investigate ? I did not have a real-formed macOS App to use LazyVGrid.

andylin2004 commented 1 year ago

Here is a Xcode project demo that basically demonstrates the issue. I am pulling the images from a remote source (Giphy) and the issue described above still occurs. https://github.com/andylin2004/TestGifVGridApp