Этот код является правильным и неправильным в зависимости от контекста. Давайте предположим, что это неправильно (с трассировкой стека), потому что он используется как:
void BadCase ()
{
UIButton rightButton = UIButton.FromType (UIButtonType.DetailDisclosure);
rightButton.TouchUpInside += (o, e) => { Console.WriteLine("hello"); };
}
В этом случае rightButton
может быть собрано (сборщиком мусора) после возврата метода (поскольку нет управляемой ссылки на локальную переменную). Однако кнопка native все еще может существовать и будет пытаться перезвонить (в код managed ), когда происходит событие касания. Это приведет к сбою (так как был собран управляемый экземпляр).
UIButton rightButton;
void GoodCase ()
{
rightButton = UIButton.FromType (UIButtonType.DetailDisclosure);
rightButton.TouchUpInside += (o, e) => { Console.WriteLine("hello"); };
}
Этого легко избежать, сохранив ссылку на кнопку, например, продвигая его из локальной переменной в поле. Это не позволит ГХ собирать кнопку managed , пока экземпляр (типа) не будет удален. Это означает, что кнопка native сможет перезвонить на управляемую землю и вывести ваш hello
.