-
Notifications
You must be signed in to change notification settings - Fork 1.9k
[iOS]Fix: FlyoutPage memory leak #28769
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[iOS]Fix: FlyoutPage memory leak #28769
Conversation
@@ -269,9 +270,7 @@ protected override void Dispose(bool disposing) | |||
} | |||
|
|||
EmptyContainers(); | |||
|
|||
Page.SendDisappearing(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this shouldn't be here. We are already calling this above
maui/src/Controls/src/Core/Compatibility/Handlers/FlyoutPage/iOS/PhoneFlyoutPageRenderer.cs
Line 132 in 8ee00e0
Page?.SendDisappearing(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does it matter if we just leave it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@PureWeen Without the PR changes, since we’re inside Dispose
, the wrapper’s Element will be null at this point — so Page
falls back to the strongly referenced _element:
maui/src/Controls/src/Core/Compatibility/Handlers/FlyoutPage/iOS/PhoneFlyoutPageRenderer.cs
Line 78 in 8ee00e0
public VisualElement Element => _viewHandlerWrapper.Element ?? _element; |
With the PR changes, _element
is resolved through a weak reference, so keeping the SendDisappearing()
call here won’t make a difference
Let me know if you think I should keep the call.
src/Controls/src/Core/Compatibility/Handlers/FlyoutPage/iOS/PhoneFlyoutPageRenderer.cs
Outdated
Show resolved
Hide resolved
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla31255.cs
Outdated
Show resolved
Hide resolved
/azp run |
Azure Pipelines successfully started running 3 pipeline(s). |
/rebase |
3f656df
to
e444f42
Compare
/rebase |
d657670
to
27e1a6b
Compare
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Bugzilla/Bugzilla31255.cs
Show resolved
Hide resolved
/azp run MAUI-UITests-public |
Azure Pipelines successfully started running 1 pipeline(s). |
/azp run MAUI-DeviceTests-public |
Azure Pipelines successfully started running 1 pipeline(s). |
* fix * enable Bugzilla31255Test * add device test * make _element a weak reference directly * fix device test * Use AssertMemoryTest in UITest
For more information about inflight process check https://github.com/dotnet/maui/wiki/Inflight-Branch-Process ## .NET MAUI Release Notes - inflight/candidate This document contains release notes for changes from main branch to inflight/candidate branch. ### MAUI Product Fixes * [iOS] Fix: FlyoutPage memory leak by @bhavanesh001 in #28769 * [Windows] Fix for CarouselView IsSwipeEnabled=False Prevents Visual Navigation by @SubhikshaSF4852 in #29286 * [Windows] Fix for Argument Exception raised when the GetStringSize method of ICanvas called with default font by @SyedAbdulAzeemSF4852 in #29048 * Removed frame styles by @Vignesh-SF3580 in #29222 * [Android] Fixed the CollectionView Header and Footer Do Not Align with Horizontal ItemsLayout When EmptyView is Displayed by @Ahamed-Ali in #28779 * Add global xmlns in template by @StephaneDelcroix in #29203 * Fixed - On iOS GestureRecognizers don't work on Span in a Label, which doesn't get IsVisible (=true) update from its parent by @KarthikRajaKalaimani in #29024 * Fixed Footer not displayed at the Bottom When EmptyView in CV2 by @Dhivya-SF4094 in #28681 * Fixed typo in Connectivity.shared.cs by @corvinsz in #29213 ### Testing * Re-enabled flaky UI test TextInEditorShouldScroll by @NirmalKumarYuvaraj in #29167 * [Testing] Re-Enabled UI Test - Issue10222Test by @TamilarasanSF4853 in #29226 * [Testing] Feature Matrix UITest Cases for CollectionView Selection Feature by @LogishaSelvarajSF4525 in #29165 ### Dependency Updates *No dependency updates in this release* ### Docs *No documentation changes in this release* ### Housekeeping *No housekeeping changes in this release* ## New Contributors * @corvinsz made their first contribution in #29213 **Full Changelog**: main...inflight/candidate
* fix * enable Bugzilla31255Test * add device test * make _element a weak reference directly * fix device test * Use AssertMemoryTest in UITest
Description of Change
While enabling the UITest
Bugzilla31255Test
, which pushes aFlyoutPage
modally and then pops it, I encountered a memory leak on iOS. TheFlyoutPage
instance was not being collected even after the modal pop.Originally, the test case was also causing a crash because
Flyout
andDetail
were being set to instances ofPage
, which is not supported. I updated them to useContentPage
, which resolved the crash.The memory leak was caused by the renderer holding a strong reference to the virtual view (
_element
), which prevented theFlyoutPage
from being garbage collected.I also added a device test that reproduces the same modal flow and asserts that the page is collected by the GC. While this device test covers the same scenario as the UITest, I’ve kept both for now.
If you'd prefer to remove the UITest and rely only on the device test, let me know.
Issues Fixed
Fixes #21206