3 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
VB6 / VBA使用確定性方法存儲(chǔ)對(duì)象。每個(gè)對(duì)象存儲(chǔ)對(duì)其自身的引用數(shù)量。當(dāng)數(shù)字達(dá)到零時(shí),對(duì)象將被銷(xiāo)毀。
當(dāng)對(duì)象變量Nothing
超出范圍時(shí),保證將其清除(設(shè)置為),這將減少其各自對(duì)象中的引用計(jì)數(shù)器。無(wú)需手動(dòng)操作。
當(dāng)您需要顯式清理時(shí),只有兩種情況:
當(dāng)您要在對(duì)象的變量超出范圍之前對(duì)其進(jìn)行銷(xiāo)毀時(shí)(例如,您的過(guò)程將花費(fèi)很長(zhǎng)時(shí)間執(zhí)行,并且該對(duì)象擁有資源,因此您希望盡快銷(xiāo)毀該對(duì)象以釋放對(duì)象)資源)。
在兩個(gè)或多個(gè)對(duì)象之間具有循環(huán)引用時(shí)。
如果
objectA
存儲(chǔ)objectB
并objectB
引用了objectA
這兩個(gè)對(duì)象,則除非通過(guò)顯式設(shè)置objectA.ReferenceToB = Nothing
或制動(dòng)鏈,否則這兩個(gè)對(duì)象將永遠(yuǎn)不會(huì)被破壞objectB.ReferenceToA = Nothing
。
您顯示的代碼段是錯(cuò)誤的。無(wú)需手動(dòng)清理。進(jìn)行手動(dòng)清理甚至有害,因?yàn)檫@會(huì)使您對(duì)更正確的代碼有錯(cuò)誤的認(rèn)識(shí)。
如果在類(lèi)級(jí)別具有變量,則在銷(xiāo)毀類(lèi)實(shí)例時(shí)將清除/銷(xiāo)毀該變量。您可以根據(jù)需要提前銷(xiāo)毀它(請(qǐng)參閱第項(xiàng)1.
)。
如果在模塊級(jí)別具有變量,則在程序退出時(shí)(或在VBA情況下,當(dāng)VBA項(xiàng)目重置時(shí))將清除/銷(xiāo)毀該變量。您可以根據(jù)需要提前銷(xiāo)毀它(請(qǐng)參閱第項(xiàng)1.
)。
變量的訪問(wèn)級(jí)別(公共或私有)不會(huì)影響其生存時(shí)間。

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
VBA使用通過(guò)引用計(jì)數(shù)實(shí)現(xiàn)的垃圾收集器。
一個(gè)給定對(duì)象可以有多個(gè)引用(例如,Dim aw = ActiveWorkbook創(chuàng)建對(duì)Active Workbook的新引用),因此,垃圾收集器僅在明確沒(méi)有其他引用時(shí)才清除該對(duì)象。設(shè)置為Nothing是減少引用計(jì)數(shù)的一種明確方法。退出范圍時(shí),計(jì)數(shù)將隱式遞減。
嚴(yán)格來(lái)說(shuō),在現(xiàn)代Excel版本(2010+)中,沒(méi)有必要將“無(wú)”設(shè)置為“空”,但是較早版本的Excel存在一些問(wèn)題(為此必須明確設(shè)置解決方法)

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
我至少有一種情況不會(huì)自動(dòng)清除數(shù)據(jù),最終將導(dǎo)致“內(nèi)存不足”錯(cuò)誤。在用戶(hù)窗體中,我有:
Public mainPicture As StdPicture
...
mainPicture = LoadPicture(PAGE_FILE)
銷(xiāo)毀UserForm后(Unload Me),mainPicture未取消分配為中加載的數(shù)據(jù)分配的內(nèi)存。我必須添加一個(gè)明確的
mainPicture = Nothing
在終止事件中。
- 3 回答
- 0 關(guān)注
- 1783 瀏覽
添加回答
舉報(bào)