From 6aff3094ce2a453ab18fb1e21212db561cd5029b Mon Sep 17 00:00:00 2001 From: Jakub Grzywacz Date: Fri, 15 Nov 2024 12:00:12 +0100 Subject: [PATCH] fix: filters memory leak on apple (#2534) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Summary While animating filters, I discovered a memory leak due to not releasing the `CGImage` after creating the mask. ## Test Plan ```tsx import {useEffect} from 'react'; import Animated, { useSharedValue, withRepeat, withTiming } from 'react-native-reanimated'; import Svg, {FeOffset, Filter, Rect} from 'react-native-svg'; const AnimatedFilter = Animated.createAnimatedComponent(Filter); const AnimatedFeOffset = Animated.createAnimatedComponent(FeOffset); const AnimatedRect = Animated.createAnimatedComponent(Rect); export default function Example() { const offset = useSharedValue(0.5); useEffect(() => { offset.value = withRepeat(withTiming(300, {duration: 3000}), -1, true); }, []); return ( ); } ``` ## Compatibility | OS | Implemented | | ------- | :---------: | | iOS | ✅ | | macOS | ✅ | --- apple/Filters/RNSVGFilter.mm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apple/Filters/RNSVGFilter.mm b/apple/Filters/RNSVGFilter.mm index 94f685d3..0e8889ee 100644 --- a/apple/Filters/RNSVGFilter.mm +++ b/apple/Filters/RNSVGFilter.mm @@ -172,9 +172,10 @@ using namespace facebook::react; CGContextAddPath(context, path); CGContextFillPath(context); - CGImageRef maskImage = CGBitmapContextCreateImage(context); - - return [CIImage imageWithCGImage:maskImage]; + CGImage *maskImage = CGBitmapContextCreateImage(context); + CIImage *ciMaskImage = [CIImage imageWithCGImage:maskImage]; + CGImageRelease(maskImage); + return ciMaskImage; } static CIFilter *sourceAlphaFilter()