<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WeakRef &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/weakref/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Thu, 02 May 2024 15:01:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Avoiding Memory Leaks with WeakRef</title>
		<link>https://blog.xojo.com/2024/05/07/avoiding-memory-leaks-with-weakref/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 07 May 2024 16:11:00 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Cast]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[WeakRef]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=12861</guid>

					<description><![CDATA[Is not that common of an issue, but it happens - when searching for memory leaks, remember to check any cross-referenced objects. Cross-referenced objects are, well, just that, objects that need to reference each other. For example, when "ClassA" needs to know about "ClassB", and "ClassB" needs to know about "ClassA". Continue reading to see how this can cause memory leaks in your projects and how to use Xojo's WeakRef to fix it.]]></description>
										<content:encoded><![CDATA[
<p>This is not that common of an issue, but&nbsp;it happens &#8211; when searching for memory leaks, remember to check any cross-referenced objects. Cross-referenced objects are, well, just that, objects that need to reference each other. For example, when &#8220;ClassA&#8221; needs to know about &#8220;ClassB&#8221;, and &#8220;ClassB&#8221; needs to know about &#8220;ClassA&#8221;. Continue reading to see how this can cause memory leaks in your projects and how to use Xojo&#8217;s WeakRef to fix it.</p>



<span id="more-12861"></span>



<p>If you&#8217;re dealing with a situation in your code where two classes need to reference each other, then you could be leaking memory if you haven&#8217;t taken steps to prevent that.</p>



<p>Let&#8217;s look at this with a simple example.</p>



<ul class="wp-block-list">
<li>Create a new Xojo project and add two new classes to it, ClassA and ClassB.</li>



<li>Add a ClassBReference As ClassB property to ClassA.</li>



<li>Add a ClassAReference As ClassA property to ClassB.</li>



<li>Add a Constructor to ClassB using the following signature:</li>
</ul>



<pre id="xojo" class="wp-block-code"><code>Constructor(reference As ClassA)</code></pre>



<p>And add this line of code to the method:</p>



<pre id="xojo" class="wp-block-code"><code>Me.ClassAReference = reference</code></pre>



<p>Next, add the Destructor method to both classes and type &#8220;Break&#8221; as the only line of code for them. This will allow us to see if they leak memory or not. For example, if when debugging the example project the Debugger doesn&#8217;t reach the Break lines, that would mean that the Destructor has not been called and, thus, the objects are not released from memory. They are leaking!</p>



<ul class="wp-block-list">
<li>Now add the Opening event handler to Window1 and type these lines into it:</li>
</ul>



<pre id="xojo" class="wp-block-code"><code>CreateReferences
Break</code></pre>



<p>As you can see, it calls the CreateReferences method and then breaks into the debugger.</p>



<ul class="wp-block-list">
<li>Now add the CreateReferences method to Window1 and type these lines of code in the associated Code Editor:</li>
</ul>



<pre id="xojo" class="wp-block-code"><code>Var ca As New ClassA
Var cb As New ClassB(ca)

ca.ClassBReference = cb</code></pre>



<p>Now it&#8217;s clear what is going on here: ClassB instance is keeping a &#8220;hard&#8221; reference to ClassA (via the ca instance), and then the ca reference is keeping a &#8220;hard&#8221; reference to the classB instance cb.</p>



<p>Run the project. Is the debugger stopping in the Break lines of ClassA and ClassB Destructors? Nope. They are leaking because they are using hard cross-references with each other.</p>



<p>You can see it more clearly when accessing Global &gt; Runtime &gt; Contents in the Debugger panel. Both objects are still alive:</p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter"><img fetchpriority="high" decoding="async" width="1250" height="132" src="https://blog.xojo.com/wp-content/uploads/2024/04/Screenshot-2024-04-03-at-12.14.16.png" alt="" class="wp-image-12862" srcset="https://blog.xojo.com/wp-content/uploads/2024/04/Screenshot-2024-04-03-at-12.14.16.png 1250w, https://blog.xojo.com/wp-content/uploads/2024/04/Screenshot-2024-04-03-at-12.14.16-300x32.png 300w, https://blog.xojo.com/wp-content/uploads/2024/04/Screenshot-2024-04-03-at-12.14.16-1024x108.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/04/Screenshot-2024-04-03-at-12.14.16-768x81.png 768w" sizes="(max-width: 1250px) 100vw, 1250px" /></figure>
</div>


<h3 class="wp-block-heading">WeakRef to the Rescue!</h3>



<p>But let&#8217;s say that your app design needs to keep these references. How do we solve this situation? The answer is using <a href="https://en.wikipedia.org/wiki/Weak_reference">weak references</a> instead of hard references, and the Xojo language has a class for it: <a href="https://documentation.xojo.com/api/language/weakref.html#weakref">WeakRef</a>.</p>



<p>Let&#8217;s change ClassA and ClassB properties so their type is a WeakRef. Setting their definition as:</p>



<pre id="xojo" class="wp-block-code"><code>ClassBReference As WeakRef
ClassAReference As WeakRef</code></pre>



<p>And let&#8217;s change the ClassB Constructor code so it creates a new WeakRef instance from the received object, instead of assigning it directly to the property.</p>



<pre id="xojo" class="wp-block-code"><code>ClassAReference = New WeakRef(reference)</code></pre>



<p>And let&#8217;s change the code in the CreateReferences method to:</p>



<pre id="xojo" class="wp-block-code"><code>Var ca As New ClassA<br>Var cb As New Classb(ca)<br><br>ca.ClassBReference = New WeakRef(cb)</code></pre>



<p>Run the example project again. Now you will see that the Debugger stops at the &#8220;Break&#8221; lines for each Class Destructor. Which means they are correctly released from memory. Problem solved!</p>



<h3 class="wp-block-heading">WeakRef Memory Care</h3>



<p>When using WeakRef objects through the code, keep in mind that accessing the real object they are referencing is done through the WeakRef.Value property in addition to <a href="https://documentation.xojo.com/getting_started/object-oriented_programming/advanced_oop_features.html#getting-started-object-oriented-programming-advanced-oop-features-casting">Cast</a> to the original Class.</p>



<p>To see it more clearly, add the &#8220;SayHello&#8221; method to ClassB and type this line of code into the associated code editor:</p>



<pre id="xojo" class="wp-block-code"><code>MessageBox("Hi From ClassB Instance")</code></pre>



<p>Then, select the CreateReferences method from Window1 and add the following line of code at the end:</p>



<pre id="xojo" class="wp-block-code"><code>ClassB(ca.ClassBReference.Value).SayHello</code></pre>



<p>First, we are accessing the ClassBRefence property from the ca instance; that gives us access to the WeakRef instance property, so we need to access its Value property in order to get access to the real object instance we are really interested (a ClassB instance).</p>



<p>But, because the Value property returns a generic Object, we need to Cast it to the class instance we expect (and should know) that is referenced by the Value property; in this case a &#8220;ClassB&#8221; instance. To do this, we are using the Cast expression:</p>



<pre id="xojo" class="wp-block-code"><code>ClassB(ca.ClassBReference.Value)</code></pre>



<p>Next, and because we did Cast it to ClassB, we can continue using the dot notation in order to call any of the methods / properties exposed by ClassB, in this case the &#8220;SayHello&#8221; method.</p>



<p>Run the app again and now the ClassB instance referenced by the ClassA instance is displaying the MessageBox.</p>



<p>In addition, when accessing a hard referenced object in your class properties it can be good to do a sanity check like:</p>



<pre id="xojo" class="wp-block-code"><code>If ca.ClassBReference &lt;&gt; Nil Then
  ca.ClassBReference.SayHello
End If</code></pre>



<p>But when using WeakRefs you need to do a double check. First against the WeakRef itself, because it can be a Nil object! And second, against the object referenced by the WeakRef itself. So the previous check will read now:</p>



<pre id="xojo" class="wp-block-code"><code>If ca.ClassBReference &lt;&gt; Nil And ca.ClassBReference.Value &lt;&gt; Nil then<br>  ClassB(ClassBReference.Value).SayHello<br>End If</code></pre>



<h3 class="wp-block-heading">Clearing It!</h3>



<p>All in all, cross-referencing objects among class instances is probably not the best design, but sometimes it is needed. In case your app design needs to follow such a path, take care and use weak references (with Xojo&#8217;s WeakRef class) instead of hard references.</p>



<p>Keep it in memory (or not, if it is leaking)… and happy coding with Xojo!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
