Krumelur
Krumelur

Reputation: 33048

MonoTouch/MT Garbage Collector: how to correctly release my views/class members (simple example)?

Have a look at the sample below which is not completely implemented but demonstrates what I'm talking about:

public class MyClass : UIView
{
  private UIView SubView;
  private UILabel ALabelInTheSubView;

  public override ViewDidLoad()
  {
  }

  // Imagine our view has a button. When clicked, a new sub view is added.
  public void HandleButtonAddView()
  {
    // Assign a new view to the SubView member and add a label.
    this.SubView = new UIView();
    this.ALabelInTheSubView = new UILabel("A label");
    this.SubView.AddSubView(this.ALabelInTheSubView);

    // Add the SubView to myself.
    this.AddSubView( this.SubView );
  }

  // Imagine our view has another button. When clicked, the sub view is removed.
  public void HandleButtonRemoveView()
  {
    this.SubView.RemoveFromSuperView();    
  }
}

QUESTION: Does the GC now know that it can now safely dispose the previously assigned UIView and UILabel? I mean, all references should be gone. Or do I have to call this.SubView.Dispose() and this.ALabelInTheSubView.Dispose() after removing from superview? And is disposing the label necessary at all, since it is a child node of the UIView, which just got removed and disposed (which would mean I always have to dispose from bottom to top)?

ADD. SIDE-QUESTION: If I call Dispose() on an object this IS still referenced - is that a a problem?

Upvotes: 4

Views: 2035

Answers (2)

miguel.de.icaza
miguel.de.icaza

Reputation: 32694

The answer is yes, the garbage collector will now consider the two previous instances of the objects to not be reachable from anywhere, and will be collected the next time the GC runs.

You do not need to call Dispose() manually. The only reason to call Dispose() manually is in cases where you know that the object you are pointing to is some large object and you want to make sure that the memory is released immediately, and not wait for the GC to kick-in at some point in the future.

What happens when you call Dispose () on the object, is that we internally release the reference to the Objective-C object and we set the Handle property on the object to null. This means that if you try to call another method on a disposed object, you will get a nice exception.

Upvotes: 3

jonathanpeppers
jonathanpeppers

Reputation: 26495

I would just reuse your SubView instead of making a new one each time. So create it in ViewDidLoad, store it in a member variable, and reuse it.

I don't think the extra memory will be a problem, and you won't have to worry about the GC at all.

Upvotes: 1

Related Questions