Circular Reference and Weak Property Pattern

  1. last year
    Edited last year

    I have a class, MyObjectClass with a property, MyReport of type MyReportClass.
    I have a Report class called, MyReportClass with a property, MyObject of type MyObjectClass.

    MyObjectClass has a method called MakeReport:

      If MyReport = Nil then
        MyReport = New MyReportClass(me)
      End if

    This gives me a circular reference.

    MyObjectClass is stored in the RowTag of a listbox.

    1) If rows in the listbox never get removed for the life of the app, do I need to be concerned about the circular reference?

    2) Assuming I do need to remove rows, I've been reading about using the Weak Property Pattern, but I don't understand how this works. Could someone explain please?

    Thank you

  2. Kem T

    13 Dec 2016 Pre-Release Testers, Xojo Pro, XDC Speakers Answer New York

    From some years ago but still relevant.

  3. Javier M

    13 Dec 2016 Pre-Release Testers, Xojo Pro AprendeXojo - Madrid, Spain

    Hi Mark,

    Maybe you can also find of interest this entry in the Xojo Blog:


  4. Thanks guys. The wording of the first article I posted, tripped me up on typing the properties. Specifically, "The private property created by Xojo now changes type to WeakRef." The private property needs to be changed manually and the original property stays as declared.

  5. Kem T

    14 Dec 2016 Pre-Release Testers, Xojo Pro, XDC Speakers New York

    One suggestion that wasn't in my original post: use computed properties to manage the WeakRefs for you.

    • Create a computed property, MyParent As ParentClass
    • Create a shadow property, mMyParentWR As WeakRef
    • Use the MyParent getter and setter to translate to and from the WeakRef.

    In this way, you can just reference MyParent without worrying about the accompanying processing. Just be prepared for MyParent to be nil.

      if mMyParentWR is nil then
        return nil
        return ParentClass( mMyParentWR.Value )
      end if
      if value is nil then
        mMyParentWR = nil
        mMyParentWR = new WeakRef( value )
      end if
  6. Tim H

    14 Dec 2016 Pre-Release Testers Portland, OR USA

    That's what Christian's post does (that he referred to in the OP), but it contained an error and was thus misleading.

  7. Dan B

    17 Feb 2017 Pre-Release Testers, Xojo Pro

    ^This helped me a lot today, thanks all!

or Sign Up to reply!