我担心我的监听器列表中可能会出现很多“不死”对象 即使它们可以被删除,仍然会得到通知。
假设以下类:
这是我的ListView,一个UI组件,我使用addItem
方法用对象填充列表。
过了一会儿,我可以打电话给clear
删除列表中的每个项目:
//Displays some Model objects
ListView
{
//Creates a new Cell via createCell and adds the Cell to the ItemList
public void addItem(MyModelObject obj) { ... }
//Simply cleares the ItemList
public void clear() { ... }
...
//Creates a new Cell to be added to the ListView
private ListCell createCell(MyModelObject obj)
{
//Create the Controller for the Cell and return the Cell
return new ListCellController(obj).getCellUI();
}
}
这是上面createCell
方法中看到的ListCellController。它保存对Model Object的引用,并负责在它控制的ListCell中设置正确的内容。
Controller将自己设置为模型对象中的监听器:
//Handles the Content that is displayed in a ListCell
ListCellController implements MyModelObjectListener
{
private final ListCell _ui = ...
public ListCellController(MyModelObject obj)
{
obj.addListener(this); //Get informed if Model Object changes
_ui.setText(obj.getName()); //Control what is displayed in the Cell
}
//Returns the UI Object that is controlled by this Controller
public ListCell getCellUI() { return _ui; }
...
}
这是模型对象,它会做一些事情,偶尔会通知听众是否有变化。
//My Model Object that informs listeners if it changed
MyModelObject
{
private List<MyModelObjectListener _listeners = ...;
...
public void addListener(MyModelObjectListener listener) { ... }
}
现在,如果我将一些项添加到ListView然后清除它会发生什么? ListView永远不会保存对Controller对象的任何引用,仅对ListCells。如果清除ListView,则丢弃对ListCell的所有引用。
ListCells不知道它们当前是显示还是已经丢弃,当然Controller也不知道。
我假设,现在,即使ListView为空,模型对象仍然保存_listeners
列表中对控制器的引用。因此,控制器不是垃圾收集的,因此ListCells都不是。
这是否意味着,如果我从ListView中添加和删除大量项目,我最终会得到一个庞大的听众列表?如何避免这种情况如果我不知道是否显示ListCell?
TL; DR:
我的_listeners
列表会阻止控制器和ListCell的垃圾收集吗?
答案 0 :(得分:0)
对不起,但我不太清楚你的问题是什么,但是对于我对垃圾收集的了解,即使两个对象互相引用,如果在运行时都没有引用它们,无论如何它们都会被删除。
因此,如果您的问题与此有关,如果您在运行时至少引用了一个侦听器,则不会进行垃圾回收,因此,您必须手动将其删除。
我希望我可以提供任何帮助。