У меня есть следующий тестовый код (на основе стандартного монодроида HelloWorld)
namespace TestGREF
{
[Activity (Label = "TestGREF", MainLauncher = true)]
public class Activity1 : Activity
{
int count = 1;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.Main);
Button button = FindViewById<Button> (Resource.Id.myButton);
button.Click += delegate {
button.Text = string.Format ("{0} clicks!", count++);
for(int i=0;i<10000;i++){
new Java.Lang.Object(new System.IntPtr(i));
//...some stuff here. Instead of Java.Lang.Object may be
//something much more useful.
}
//If uncomment here, looks ok
//GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
};
}
}
}
Если я нажимаю кнопку 5-6 раз, приложение вылетает.
Я знаю, что это происходит из-за ограничения глобальных ссылок (GREF) (описано здесь , раздел «Неожиданные исключения NullReferenceExceptions»). Вопрос: что с этим делать? Какова лучшая практика? Если возможно, с примером кода, пожалуйста
Если раскомментировать вызов GC.Collect (), все кажется работающим, но слишком частый вызов GC слишком дорог для производительности. Другой популярный дизайн - поставить цикл операторов, но это не всегда является возможной причиной логики программы.
Есть еще идеи?