我们在编写java程序的时候创建了一些资源对象,当资源对象使用完后,往往会忘了释放资源。也许有人会认为不是有java的垃圾回收机制吗?干嘛还要我们自己手动释放资源对象呢?是有java的垃圾回收机制,但它只能回收java虚拟机中的对象,而对于本地操作系统的对象是不能够自动释放的,所以对于本地系统资源的释放要显示地释放掉。系统资源包括颜色、字体、图像、SWT中创建的各种控件等。在使用完系统资源后一定要释放掉,否则会严重地影响系统的整体性能。例如:
Color color = new Color(display,255,0,0);
color.display();
而对于从底层平台获得的资源,我们不需要释放,例如:
Color color = display.getSystemColor(SWT.COLOR_RED);
为什么呢?因为这个资源不是我们创建的,我们只是引用它而已,也许还会有其他的对象也在使用该资源,如果释放掉了该资源会带来不可预知的严重后果。
资源释放的原则:
1.遵循“谁创建谁释放”的规则;
2.释放了父控件也就释放了子控件。比如说窗口(shell)对象中有一个Composite容器,释放了shell时,该Composite也被隐式地释放了。该规则只适用于Widget的子类。如果程序中使用了系统资源(比如:颜色、字体等),仍需要在程序中显示地释放掉。
3.释放了控件也就释放了控件所设置的菜单。
SWT不允许访问已经释放了的控件,否则会抛异常“Widget is disposed”。我们可以使用控件对象的isDisposed()方法来判断控件是否已经被释放了。例如:
if(!shell.isDisposed()){
shell.dispose();
}