Skip to content

Commit 33778a1

Browse files
chore: test app memory leaks (#158)
<!-- CURSOR_SUMMARY --> > [!NOTE] > **Low Risk** > Low risk: test-app-only changes that tighten view controller containment and use weak captures to avoid retain cycles/leaks in overlay cleanup closures. > > **Overview** > Fixes potential memory leaks in the test app’s UIKit dialog overlays by updating `cleanup` closures to capture `timerVC`/`dimView` weakly. > > Also makes the “Current Window” overlay use proper view-controller containment (`addChild`/`didMove` and `willMove`/`removeFromParent`) so the timer controller is detached cleanly when dismissed. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 407cc7a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent 2155896 commit 33778a1

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

TestApp/Sources/SessionReplay/Masking/DialogsUIKitView.swift

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,11 @@ final class DialogsUIKitViewController: UIViewController {
152152
timerVC.view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
153153
timerVC.view.clipsToBounds = true
154154

155-
let cleanup: () -> Void = {
156-
timerVC.willMove(toParent: nil)
157-
timerVC.view.removeFromSuperview()
158-
timerVC.removeFromParent()
159-
dimView.removeFromSuperview()
155+
let cleanup: () -> Void = { [weak timerVC, weak dimView] in
156+
timerVC?.willMove(toParent: nil)
157+
timerVC?.view.removeFromSuperview()
158+
timerVC?.removeFromParent()
159+
dimView?.removeFromSuperview()
160160
}
161161

162162
timerVC.onComplete = cleanup
@@ -197,15 +197,19 @@ final class DialogsUIKitViewController: UIViewController {
197197
timerVC.view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
198198
timerVC.view.clipsToBounds = true
199199

200-
let cleanup: () -> Void = {
201-
timerVC.view.removeFromSuperview()
202-
dimView.removeFromSuperview()
200+
let cleanup: () -> Void = { [weak timerVC, weak dimView] in
201+
timerVC?.willMove(toParent: nil)
202+
timerVC?.view.removeFromSuperview()
203+
timerVC?.removeFromParent()
204+
dimView?.removeFromSuperview()
203205
}
204206

205207
timerVC.onComplete = cleanup
206208
dimView.onTap = cleanup
207209

210+
addChild(timerVC)
208211
dimView.addSubview(timerVC.view)
212+
timerVC.didMove(toParent: self)
209213

210214
let visibleX = -oversizedFrame.origin.x
211215
let visibleY = -oversizedFrame.origin.y
@@ -276,11 +280,11 @@ final class DialogsUIKitViewController: UIViewController {
276280
timerVC.view.layer.cornerRadius = 16
277281
timerVC.view.clipsToBounds = true
278282

279-
let cleanup: () -> Void = {
280-
timerVC.willMove(toParent: nil)
281-
timerVC.view.removeFromSuperview()
282-
timerVC.removeFromParent()
283-
dimView.removeFromSuperview()
283+
let cleanup: () -> Void = { [weak timerVC, weak dimView] in
284+
timerVC?.willMove(toParent: nil)
285+
timerVC?.view.removeFromSuperview()
286+
timerVC?.removeFromParent()
287+
dimView?.removeFromSuperview()
284288
}
285289

286290
timerVC.onComplete = cleanup

0 commit comments

Comments
 (0)