Am 14.07.2008 um 09:51 schrieb Rob Rothwell:
On Mon, Jul 14, 2008 at 11:42 AM, Todd Blanchard tblanchard@mac.com wrote: So how do you make a weak reference? You stick a WeakArray in as a holder. So in your parent/child objects you would write something like:
Node>>parent ^ parent ifNotNil: [parent first] ifNil: [parent]
Node>>parent: p parent := p ifNotNil: [WeakArray with: p] ifNil: [p]
thus using a WeakArray as a holder for the parent.
When a weak reference gets garbage collected, its weak references are set to nil first.
Thank you! This is what I wanted to know; I'll give this a try, and see how it works for me...
So many Classes, so little time...
Well, Todd certainly knows when he needs to introduce weak refs but a simple parent-child relation (say, in a tree) is *not* a good example for this. The parent reference in a child does not prevent it from being garbage-collected, unless there exist other references to it. You cut the child link and it's gone. But if there are indeed other references to the child weak refs would just mask the problem because the parent may get garbage-collected but the child is not. The problem in that case typically is not the parent/child links but those other references.
In a clean design you very rarely need weak refs. Also, you need to sprinkle your code with ifNil: tests because a weak ref can become nil any time.
- Bert -