IFeatureClass.Search方法的 bool Recycling 引數理解
IFeatureClass的Search方法 大家經常用到,很多人對Search方法的其中一個引數bool Recycling不是很理解。
我經過測試提出個人的觀點:
1.IFeatureCursor儲存的是所有符合條件的Feature物件的引用,
2.Recycling的意思是回收,引數Recycling為True的時當執行這個方法IFeature pFeature=pFeatureCursor.NextFeature()上一條記錄的值在記憶體中所佔的地址就會被銷燬回收,為False的時候當執行這個方法IFeature pFeature=pFeatureCursor.NextFeature()上一條記錄的值依然存在在記憶體中。
3. 該回收引數控制行物件分配行為。回收遊標可在每次提取時為單個要素物件重新水化,並可用於優化只讀訪問,例如,在繪製時。在多個對遊標的NextFeature的呼叫上維護對回收遊標返回的要素物件的引用是非法的。不應修改回收游標返回的功能。非回收遊標在每次獲取時返回單獨的功能物件。可以修改非循環遊標返回的特徵並以多型行為儲存。
地理資料庫保證在編輯會話期間獲取的非回收功能物件上的“唯一例項語義”。換句話說,如果搜尋游標檢索到的特徵已經被例項化並且正在被呼叫應用程式引用,則返回對現有特徵物件的引用。
從搜尋方法返回的非回收功能遊標*必須*在將遊標中的要素複製到另一個類的插入遊標時使用。這是因為回收游標重用相同的幾何圖形,並且在某些情況下插入到插入游標中的所有要素可能具有相同的幾何圖形。使用非循環遊標可確保每個幾何體都是唯一的。
1.引數Recycling設定為True ,出現問題:要素已刪除,因對搜尋到的要素進行了打斷處理,要素本身已經存在,及記憶體中沒有該記錄了
分析:IFeatureCursor集合儲存了指向IFeatureClass上所有Feature的引用,但是由於Recycling引數設定為TRUE也就是說每執行一個NextFeautre方法上一條記錄的Feature值在記憶體中被回收,所以到最後遍歷pFeatures集合的時候所有的IFeature引用指向的Feature物件都為Null。所以會引發一下錯誤(如下圖所示):
2.引數Recycling設定為False
分析:pFeatures集合儲存了指向FeatureClass上所有Feature的引用,但是由於Recycling引數設定為False也就是說每執行一個NextFeautre方法上一條記錄的Feature值在記憶體中依然存在,所以到最後遍歷pFeatures集合的時候所有的IFeature引用指向的Feature物件都依然存在。程式正常執行。
3 總結:如果只是對要素的屬性資訊進行編輯的話,建議bool Recycling為true,能減少記憶體的消耗;當操作造成要素類要素個數或者幾何圖形發生變化時bool Recycling應設定為false。