我们如何删除Dart中的对象?

时间:2013-12-09 22:55:11

标签: dart

我想基本上删除我创建的对象。我们如何删除对象?

我检查了Object定义here,但无法找到方法。我也很好奇我们是否可以定义析构函数。

更新 问题是获得好的答案。但我想提请你注意我想要删除我的对象或调用析构函数的情况。假设我们想要使用您可以通过放置在其上的端口连接矩形来创建节奏。因此,我们的想法是拥有一个对象,该对象具有对矩形体的引用和两端的端口。实际上,该对象可能需要一些其他属性,如[bool] selected[bool] dragging[List<RectElement>] connectedSquares。例如,当用户选择矩形并命中退格时,我想确保矩形消失并且我的对象被正确删除。因此,这个用例可以更深入地了解这个问题。

4 个答案:

答案 0 :(得分:8)

您无需主动删除Dart中的对象。

Dart是一种垃圾收集语言,因此任何不包含任何引用的对象最终都会被运行时系统垃圾收集和释放。

所以你要做的就是清除你引用该对象的任何变量。

垃圾收集实际上隐含在语言规范中。规范没有说存在垃圾收集(它甚至没有提到概念),但是语言和库的设计方式使得垃圾收集成为可能:程序无法找到对任何地方的引用的对象不能再影响程序的行为了,所以垃圾收集器正在收集和删除它们是不可检测的。

答案 1 :(得分:3)

确保您没有持有对象的引用,因此可以进行GCed。

x = null;

答案 2 :(得分:3)

目前,Dart程序部署为JavaScripts,因此仅限于JavaScript运行时模型。在this question查看示例,阐明在JavaScript中删除对象的唯一方法是通过垃圾收集器。如果您在connectedSquares上致电removeremoveAt等,并且未提及任何其他参考资料,则可以完成您所需要的工作。

对于析构函数,同样的限制也适用。如果保存对“矩形体和两端放置的端口”的引用的对象变得无法访问,那么它引用的所有内容也有资格进行垃圾回收 - 如果没有其他引用的话。

一般来说,如果你想要全面了解Dart的运行时语义,那么(现在)也需要理解JavaScript,查看编译代码,并通过类比学习。

答案 3 :(得分:1)

关于删除的一些补充说明。

JavaScript的局限性正在影响飞镖。

  • 没有参考计数
    这是javascript功能,部分原因是垃圾收集在浏览器中的工作方式:What is JavaScript garbage collection?
  • 没有弱参考(暂时)
    另一个Java脚本限制,并且由于缺少对引用计数的访问,自行删除也不是一种选择。
    注意:有扩展,虽然它很有用,但它不是弱参考等价物。弱引用允许您创建不会使对象保持活动的幽灵引用:https://en.wikipedia.org/wiki/Weak_reference
  • 没有可用的析构函数
    javascript没有它,因此也没有飞镖。

正如其他人指出的那样,上述限制通常都没有。
由于主eventloop可以保持对象存活,粗心的编码可以产生一个僵尸对象;没有析构函数或弱点,一些引用可以意外地逃脱你的杀手,并保持对象的活着。

import 'dart:html';
import 'dart:async';
import 'dart:developer';

void main() {
  var e = new XXX();
  var ce = new CustomEvent('custom-event');
  var s = new Stream.periodic(new Duration(microseconds: 10000),(count) {
    print(count);
    window.dispatchEvent(ce);
    return count;
  });
  StreamSubscription ss = s.listen((count){print('stream runnig; ${count}_th run');});
//  e.destroy();
//  ss.cancel();
  e = null;
  s = null;
}
class XXX{
  StreamSubscription subscription;
  XXX(){
    subscription = window.on['custom-event'].listen(event_handler);
  }
  void say_hi(){
    print('hi');
    print(this);
  }
  void event_handler(_){this.say_hi();}
  destroy(){
    subscription.cancel();
  }
}

上面的代码在永久循环中打印下面的内容(除非你取消注释这两行):

 ....
hi
VM33:1 Instance of 'XXX'
VM34:1 stream runnig; 751_th run
VM34:1 752
VM33:1 hi
VM33:1 Instance of 'XXX'
VM34:1 stream runnig; 752_th run
......

我不知道对象e是否会在没有打印(这个)的情况下持续存在,也许只有相关的对象不会被垃圾收集。

在任何情况下,使用更复杂的代码,手动清理是必要的,我希望有三个缺失的功能之一,但没有。

删除确实很难。