6

雖然根據第"Performance"讀取Xamarin文檔,我注意到的以下章節:Xamarin垃圾收集和循環引用

下圖說明可與強引用會出現一個問題:

Circular reference

對象A對對象B有強烈的引用,而對象B對對象A有強烈的引用。這種對象被稱爲不朽對象由於存在cir強烈的參考。這種父子關係並不罕見,因此即使對象不再被應用程序使用,垃圾收集器也無法收回對象。

這是我第一次聽說C#/ .NET/Mono上下文中的「不朽的對象」。

頁面隨後繼續建議在其中一個對象中使用WeakReference,這將刪除強循環引用並修復此「問題」。

Xamarin.Android使用Mono的Simple Generational garbage collector:上garbage collection聲稱

與此同時,Xamarin文檔。這是一個標記和掃描垃圾回收器[...]

是否標記和掃描GC不受循環引用的影響?

回答

8

由於循環引用導致的內存泄漏僅適用於Xamarin.iOS,它使用本機對象的引用計數。

約不朽對象也says頁:

伯姆 - 這是一個保守的,非代垃圾收集器。它是 是默認垃圾收集器,用於使用Classic API的Xamarin.iOS應用程序 。

第二個報價具體談到Xamarin.Android。

+0

謝謝。我也注意到可以在iOS上啓用SGen(在選項中有一個複選框),但它被標記爲「實驗性」。在實踐中,有沒有人有過使用iOS上的SGen的經驗,並且是否解決了這個問題? – Lou

+0

有一個[新的參考計數系統](https://developer.xamarin.com/guides/ios/advanced_topics/newrefcount/),如果我理解正確,它的目的是解決相反的問題(對象收集太積極)。有趣的是,它與SGen/Boehm不同。我想這意味着即使使用SGen,iOS對象也被引用計數,並且應避免循環引用。 – bwt