Skip to content

Commit 0068df8

Browse files
committed
fix(ios): fix memory leak in custom asset loader closure
Use weak self capture in customLoader closure to prevent retain cycle between RiveReactNativeView and RiveFile.
1 parent 7288a56 commit 0068df8

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

ios/RiveReactNativeView.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,13 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
3333
var cachedRiveFile: RiveFile?
3434
var previousReferencedAssets: NSDictionary?
3535
var cachedFileAssets: [String: RiveFileAsset] = [:]
36-
36+
37+
private var weakCustomLoader: ((RiveFileAsset, Data, RiveFactory) -> Bool) {
38+
return { [weak self] asset, data, factory in
39+
self?.customLoader(asset: asset, data: data, factory: factory) ?? false
40+
}
41+
}
42+
3743
@objc var resourceName: String? = nil {
3844
didSet {
3945
if (resourceName != nil) {
@@ -330,11 +336,11 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
330336

331337
let updatedViewModel : RiveViewModel
332338
if let smName = stateMachineName {
333-
updatedViewModel = RiveViewModel(fileName: name, stateMachineName: smName, fit: convertFit(fit), alignment: convertAlignment(alignment), autoPlay: autoplay, artboardName: artboardName, customLoader: customLoader)
339+
updatedViewModel = RiveViewModel(fileName: name, stateMachineName: smName, fit: convertFit(fit), alignment: convertAlignment(alignment), autoPlay: autoplay, artboardName: artboardName, customLoader: weakCustomLoader)
334340
} else if let animName = animationName {
335-
updatedViewModel = RiveViewModel(fileName: name, animationName: animName, fit: convertFit(fit), alignment: convertAlignment(alignment), autoPlay: autoplay, artboardName: artboardName, customLoader: customLoader)
341+
updatedViewModel = RiveViewModel(fileName: name, animationName: animName, fit: convertFit(fit), alignment: convertAlignment(alignment), autoPlay: autoplay, artboardName: artboardName, customLoader: weakCustomLoader)
336342
} else {
337-
updatedViewModel = RiveViewModel(fileName: name, fit: convertFit(fit), alignment: convertAlignment(alignment), autoPlay: autoplay, artboardName: artboardName, customLoader: customLoader)
343+
updatedViewModel = RiveViewModel(fileName: name, fit: convertFit(fit), alignment: convertAlignment(alignment), autoPlay: autoplay, artboardName: artboardName, customLoader: weakCustomLoader)
338344
}
339345
cachedRiveFile = updatedViewModel.riveModel?.riveFile
340346
warnForUnusedAssets()
@@ -360,7 +366,7 @@ class RiveReactNativeView: RCTView, RivePlayerDelegate, RiveStateMachineDelegate
360366
return
361367
}
362368
do {
363-
let riveFile = try RiveFile(data: data, loadCdn: true, customAssetLoader: customLoader)
369+
let riveFile = try RiveFile(data: data, loadCdn: true, customAssetLoader: weakCustomLoader)
364370
self.cachedRiveFile = riveFile
365371
let riveModel = RiveModel(riveFile: riveFile)
366372
let fit = self.convertFit(self.fit)

0 commit comments

Comments
 (0)