Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ios] fix memory leak in CollectionView cells (#15831)
Context: #14664 Context: https://github.com/nacompllo/MemoryLeakEverywhere/tree/bugfix/memoryLeakItemsSource In reviewing our latest changes in main with the above customer sample, I found that there appeared to be leaks related to MAUI's `UITableViewCell` subclasses when using `CollectionView`. I was able to reproduce the issue in a test, such as: // DataTemplate saves WeakReference to the View in a list collectionView.ItemTemplate = new DataTemplate(() => { var label = new Label(); labels.Add(new(label)); return label; }); // Create a cell and bind it to the template: cell = new VerticalCell(CGRect.Empty); cell.Bind(collectionView.ItemTemplate, bindingContext, collectionView); // Check we have no leaks foreach (var reference in labels) { Assert.False(reference.IsAlive, "View should not be alive!"); } After isolating the issue, I found the issue was the `TemplatedCell.PlatformHandler` property: internal IPlatformViewHandler PlatformHandler { get; private set; } This stores a copy of the `LabelHandler` in our test/example. The problem with `UITableViewCell` is that UIKit holds onto these and reuses them. This means that UIKit may keep the `LabelHandler` alive longer than needed. It also appears to be a somewhat complex circular reference: * `CollectionView` -> handlers / etc. -> `TemplatedCell` -> `LabelHandler` -> `Label` -> `CollectionView` I made the `PlatformHandler` use a `WeakReference` as its backing field and the problem goes away! I will retest #14664 to verify if it is fully solved.
- Loading branch information