Guardando Advanced Memory Management da Mark Probst e Rodrigo Kumpera, ho imparato nuove tecniche come la creazione di profili Mono GC e l'utilizzo di WeakReference
.Come posso risolvere il ciclo del GC causato da un gestore di eventi lambda?
Ma io ancora non capisco come a “riparare” il Puzzle 2 da 28 ':
public class CustomButton : UIButton {
public CustomButton() { }
}
public class Puzzle2Controller : UIViewController
{
public override void ViewDidLoad()
{
var button = new CustomButton();
View.Add (button);
button.TouchUpInside += (sender, e) =>
this.RemoveFromParentViewController();
}
}
Il controller contiene un ref al tasto che contiene un ref al gestore di eventi che contiene un ref al controller.
Un modo per interrompere il ciclo sarebbe annullare il pulsante. Un altro modo è quello di staccare il gestore (ma dovremmo abbandonare l'utilizzo di lamdas).
Ci sono altri/più eleganti/modi per interrompere il ciclo? Possiamo in qualche modo attaccare WeakReference
qui?
Grazie.
Modifica: In questo caso, il pulsante non è nemmeno un campo. Ma c'è ancora un ciclo, non c'è? È nella sottoview di Controller's View. Dobbiamo eliminarli? Non ho capito bene.
Ciao, grazie per la risposta. Questo certamente sarebbe un'opzione, ma sfortunatamente 'UIView' non ha riferimenti ai loro controllori. Se la mia comprensione è corretta, i cicli in MonoTouch * sono * un problema perché gli oggetti ObjC nativi sotto il cofano usano il conteggio dei riferimenti. (Vedi 21:30) –
@DanAbramov in tal caso, vedere la modifica –
Grazie! Questo ha assolutamente senso. –