On Tue, 15 Jul 2008 23:21:17 +0200, nicolas cellier wrote:
...
While we are at it, here is a lesson i learned recently:
| weak obj | weak := WeakIdentityKeyDictionary new.
"Create an Object" obj := Object new. "Add a weak reference to this Object" weak at: obj put: (Array with: obj). "This DoIt methods points to the Object via it's temporary variable. Clear this pointer, so that the Object can eventually be reclaimed" obj := nil. "Now garbageCollect to reclaim the weak references" Smalltalk garbageCollect. "Let us see if the Object was reclaimed:" ^weak size
Why the object obj was not reclaimed?
Perhaps because WeakIdentityKeyDictionary (as well as WeakKeyDictionary) instance variable is not initialized/assigned, as its name suggests something Weak* ;)
Do (WeakIdentityKeyDictionary new inspect) and check for Weak* things: none here. This is so in the .image version that I'm using right now, 'Squeak3.10.2', haven't checked others.
Obviously, the WeakKeyAssociation value is not weak... It is a strong pointer and points strongly to obj through the Array...
Or it's just a Weak* instance variable bug :( anybody confirm this?
Trivial, you might say. Well yes, it is just http://bugs.squeak.org/view.php?id=7119 in disguise and i find it nasty.
So be very carfull with Weak references - not only newbs - issues might definitely be advanced to track down...
Nicolas