本帖最后由 hyefeifei 于 2015-3-28 15:12 编辑
释放内存 如果各位下载了附件6并进行了测试,我请你再打开附件6,然后打开任务管理器,用鼠标不断点击“测试捕获事件”按钮,会出现excel所占内存在不断增长,我们查看一下代码: - Sub 测试捕获事件()
- Dim rng As Range, i As Long
- If Not rngD Is Nothing Then
- Set rngD = Nothing ‘内存增长说明此句没起作用
- End If
- Set rngD = New rngFormatDS '实例化类,形成对象
- Set rngD.Sheet = ThisWorkbook.Sheets("sheet1")
- For Each rng In Range("a1:a41")
- rngD.Add rng
- Next
- For i = 1 To rngD.Count
- rngD.Items(i).unColor
- Next
- End Sub
复制代码 内存不断增长的事实,说明代码中set rngD=Nothing 这句没起作用。这是因为rngD中包括了rngFormat实例,rngFormat实例有Parent属性,引用了rngD,这种自身缠绕,使得当你消除rngD对象时,并不能消除rngFormat对象。所以,我们需要在rngFormatDS类中,增加个方法,引用这个方法,即可消除每一个rngFormat实例,方法如下: - Public Sub Terminate()
- csDic.RemoveAll
- End Sub
复制代码 因为我们是用字典存储rngFormat实例的,字典的removeall可以把它所含的所有对象置为nothing。 但是如果在集合类中,我们不是用字典存储对象,而是用collection或者数组来存储对象,那么想释放内存就麻烦的多,那样的话,首先,我们就不得不在rngFormat类中构建一个方法,解除对父类的引用。然后再在父类中构建方法,利用循环,依次把子类的实例置空。在这里,不嫌麻烦的网友可以自己测试一下,这里就不麻烦给出代码了。 最后,我们还只要把SetrngD = Nothing这句改为rngD.Terminate就可以了。或者保留这句,在它前面加上rngD.Terminate也行。Set rngD = Nothing 这句不要的话,虽然rngD不为nothing,但是因为它之中的csdic已经清空了,所以也就不占内存了。所以说要不要皆可。至此为止的代码,见附件7
类_7.rar
(39.37 KB, 下载次数: 94)
|