此問題已以多種不同形式提出,但我不確定我的情況是否完全適用。Javascript:將類/對象引用設置爲NULL,內存中的子對象/類會發生什麼?
說,我有一個node.js程序。我的程序通過實例化一個名爲Stream的類來連接到Stream。在Stream中,StreamParser類被實例化,其中包含幾個定時器。
當我I Stream.destroy()
我的原始流,保存StreamParser的對象設置爲null
。內存空間會發生什麼,定時器會發生什麼?看來我的計時器仍在運行,除非我明確clearTimeout
他們...
所以,嵌套結構:
new Stream()
-> this.stream = new StreamParser()
-> this.intv = setInterval(function() { // code }, 1000);
// Streams are destroyed like this:
Stream.destroy()
-> calls this.stream.destroy(function() {
self.stream = null;
// stream is null. but timers seem to be running. So, is stream still in memory?
}
我有點困惑。多一點擴展的代碼示例:
// main call.
var stream = new Stream();
stream.connect();
setTimeout(function() {
stream.destroy(function() {
stream = null;
});
}, 60000);
/** ############# STREAM ############### **/
function Stream() {
this.stream = null;
this.end_callback = null;
}
Stream.prototype.connect = function() {
var self = this;
new StreamParser('stream.com', function(stream) {
self.stream = stream;
self.stream.on('destroy', function(resp) {
if(self.end_callback !== null && typeof self.end_callback === 'function') {
var fn = self.end_callback;
self.end_callback = null;
self.stream = null;
fn();
} else {
self.stream = null;
}
});
});
}
Stream.prototype.destroy = function(callback) {
this.end_callback = callback;
this.stream.destroy();
}
/** ############# STREAM PARSER ############### **/
function StreamParser(uri, callback) {
var self = this;
this.conn = null;
this.callback = null;
this.connectSocket(uri, function(conn) {
self.conn = conn;
self.callback(conn);
})
setInterval(function() {
self.checkHeartbeat();
}, 1000);
}
StreamParser.prototype.checkHeartbeat = function() {
// check if alive
}
StreamParser.prototype.destroy = function() {
this.conn.destroy();
this.emit('destroy', 'socket was destroyed');
}