我有内存泄漏问题。
我基本上有一个MvxTableViewController数据绑定到一个observablecollection。我创建了一个MvxTableViewController并将其作为子项添加到我的Controller中,并将视图添加为子视图。
问题是,表中的Cell永远不会被丢弃,泄漏内存。
// When the view gets removed from the stack, the cells disposed method is never called and I can see the memory not going away, using the Xcode Instruments tool. The table dispose gets called as expected. but not the cell
public partial class ParticipantTableViewCell : MvxTableViewCell
{
readonly UILabel _nameLabel = new UILabel();
readonly UILabel _locationLabel = new UILabel();
readonly PictureContainer _pictureView = new PictureContainer(7.0f);
public ParticipantTableViewCell (IntPtr handle) : base(handle)
{
BackgroundColor = UIColor.Clear;
SelectionStyle = UITableViewCellSelectionStyle.None;
ContentView.AddSubviews(new UIView[] {_nameLabel, _locationLabel, _pictureView});
_pictureView.TransparentBackground = true;
SetupConstraints();
// Since this view is readonly, I've removed the actual binding code
// and instead manually init each views.
this.DelayBind(() => {
_nameLabel.Text = ((ParticipantViewModel)DataContext).Name;
_locationLabel.Text = ((ParticipantViewModel)DataContext).Location;
IsSelected = ((ParticipantViewModel)DataContext).IsSelected;
_pictureView.AvatarImage.Image = UIImage.FromFile ("Media/" + ((ParticipantViewModel)DataContext).AvatarUrl);
});
}
void SetupConstraints ()
{
ContentView.Subviews.ForEach(v => v.TranslatesAutoresizingMaskIntoConstraints = false);
ContentView.AddConstraints(
_pictureView.Height().EqualTo().HeightOf(ContentView),
_pictureView.Width().EqualTo().HeightOf(ContentView),
_pictureView.WithSameCenterY(ContentView),
_pictureView.Left().EqualTo(6.0f).LeftOf(ContentView),
_nameLabel.Left().EqualTo(10.0f).RightOf(_pictureView),
_nameLabel.Right().EqualTo().RightOf(ContentView),
_nameLabel.Bottom().EqualTo(2.0f).CenterYOf(ContentView),
_locationLabel.Left().EqualTo(10.0f).RightOf(_pictureView),
_locationLabel.Right().EqualTo().RightOf(ContentView),
_locationLabel.Top().EqualTo(4.0f).CenterYOf(ContentView)
);
}
// never called
protected override void Dispose (bool disposing)
{
base.Dispose(disposing);
}
}
class FriendsView : MvxTableViewController
{
protected new FriendsViewModel ViewModel { get { return (FriendsViewModel) base.ViewModel; } }
public FriendsView ()
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad();
TableView.BackgroundColor = UIColor.Clear;
TableView.SeparatorStyle = UITableViewCellSeparatorStyle.None;
TableView.RowHeight = 60;
TableView.ScrollEnabled = false;
var source = new MvxSimpleTableViewSource(TableView, typeof(ParticipantTableViewCell));
TableView.Source = source;
var set = this.CreateBindingSet<FriendsView, FriendsViewModel>();
set.Bind(source).To(vm => vm.YuFitFriends);
set.Apply();
}
}
有人知道我的细胞泄漏的原因吗?
感谢 拍
答案 0 :(得分:1)
**// never called**
protected override void Dispose (bool disposing)
{
base.Dispose(disposing);
}
你认为这会被神奇地召唤吗? NO!
Dispose只是你班级中的另一种方法,当你不再需要它的实例时,你应该调用它。
此外,您应该在此Dispose方法中处理类中的所有一次性实例(例如:PictureContainer)。此外,请确保您取消订阅任何活动订阅。只是调用base.Dispose不会在此类中释放任何引用。
答案 1 :(得分:-2)
我得到了一个有效的解决方案......这些错误似乎与MvvmCross如何注册单元格以供重用。如果我从MvxBaseTableSource派生我自己的类而不是使用MvxSimpleTableSource并且我以不同方式创建单元格,那么我可以正确处理所有内容:
class MySource : MvxTableViewSource
{
public MySource (UITableView tableView) : base(tableView)
{
}
protected override UITableViewCell GetOrCreateCellFor (UITableView tableView, NSIndexPath indexPath, object item)
{
var cell = tableView.DequeueReusableCell (ParticipantTableViewCell.Key) as ParticipantTableViewCell;
if (cell == null)
cell = new ParticipantTableViewCell ();
return cell;
}
}
在我的tableviewcontroller中,我使用MySource
var source = new MySource(TableView);
现在收集的一切都很好!