MvxTableViewCell没有处理

时间:2015-05-29 21:18:32

标签: c# ios uitableview memory-leaks mvvmcross

我有内存泄漏问题。

我基本上有一个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();
    }
}

有人知道我的细胞泄漏的原因吗?

感谢 拍

2 个答案:

答案 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);

现在收集的一切都很好!