Sure.
I am using an MVC pattern, where model changes are notified via events.
Multiple views, lets call two of them view1 and view2, are capable of
displaying an object X, which is in the model. Whenever X is modified
(in the sense of modifying a property of it) an event is fired. Views,
which display an aspect of X register themselves to the modified-event
of X to be refreshed. However, views may be closed, so a view which was
closed shall be unsubscribed from that event automatically. Without an
iterable WeakSet, I have to unsubscribe the view manually on disposal.
This is more error prone, as different views subscribe to different
model change events, so each of my views needs kind of a destructor,
which unregisters it from all such event handlers, which it registered
to - if you forget one, you have a memory leak.
Actually ECMAScript should introduce WeakReference, which is sth. like a
variable, which may lose its object, when no "non-Weak" reference to it
exists anymore. Losing the value means it returns undefined again. example:
let a = {};
let weak b = a;
console.log(typeof(b)); // prints object
a = {};
console.log(typeof(b)); // prints undefined
Having WeakReferences and iterable WeakSet/WeakMap would help a lot in
preventing memory leaks.
Of course, as stated before: it would be preferred, if the WeakReference
/ WeakSet / WeakMap is predictable in the sense, that their state does
not depend on "whether an object has actually been garbage collected",
but on "whether an object still has 'non-weak' references pointing to
it, aka 'is garbage-collectable". Of course this involves checking
garbage-collectability on access to the WeakReference / WeakSet / WeakMap.
On 13.07.2016 15:08, Isiah Meadows wrote:
Could you explain a real world use case for this? I recall some that
it would've simplified some, but the best implementation often didn't
even require iteration, but just changing the data layout altogether.
On Wed, Jul 13, 2016, 08:13 Michael Kriegel
<[email protected]
<mailto:[email protected]>> wrote:
Hi everyone,
not sure, whether this is the right place for discussing a feature
request - and how to find out, whether this was already
proposed/discussed before and with which result... My google
search did
not bring up anything about it.
On my opinion it should be made possible to iterate over all
elements in
a WeakSet & WeakMap. I already found many cases, in which I'd like to
have used the neat feature of "garbage collect the object, if it
is not
referred to by others anymore", but with the necessity to know, which
objects are in the set (not only, if a given object is). An example:
Registering callbacks to objects:
class Foo {
onBla(Handler) {
this.BlaSuperWeakMap.push(Handler);
}
someOtherMethod() {
for (let X in this.BlaSuperWeakMap) {
X();
}
}
constructor() {
this.BlaSuperWeakMap = new SuperWeakMap();
}
}
const MyFoo = new Foo();
{
let MyHandler1 = function(){
console.log('MyHandler1 called');
};
MyFoo.onBla(MyHandler1);
console.log('Invokation1:');
MyFoo.someOtherMethod();
}
let MyHandler2 = function(){
console.log('MyHandler2 called');
};
MyFoo.onBla(MyHandler2);
MyFoo.onBla(function(){
console.log('MyHandler3 called');
});
console.log('Invokation2:');
MyFoo.someOtherMethod();
MyHandler2 = undefined;
console.log('Invokation3:');
MyFoo.someOtherMethod();
Expected result:
Invokation1:
MyHandler1 called
Invokation2:
MyHandler2 called
Invokation3:
Basically the example is: Invoke the callback of all objects which
still
"exist" (in the meaning of having "non-weak" references towards them).
I know this may have some caveats. It would be necessary to check the
reference count of the object in the SuperWeakSet, because the object
may have no "non-weak" references left but still was not yet garbage
collected. I do not know, whether current
ECMAScript-Implementations and
their garbage collecting solutions could handle this easily -
basically
it is the same decision, which the garbage collector would make: If an
object can be disposed, because it has no non-Weak references pointing
to it, the object is by definition not in the WeakSet anymore. And
implementations could in that case even give a hint to the garbage
collector, which may improve performance of applications, which
use the
SuperWeakSet alot.
Greetings, Michael
_______________________________________________
es-discuss mailing list
[email protected] <mailto:[email protected]>
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss