Xamarin связывание событий WeakDelegate проблема
У меня есть следующие
Код iOS:
@protocol TestDelegate
- (void)onSuccess:(NSString*)token;
@end
@interface Utility : NSObject
@property (nullable, weak, getter = getTestDelegate, setter = setTestDelegate:) id<TestDelegate> delegate;
@end
и Sharpie сгенерировали код с делегатом для отображения событий:
[Protocol, Model]
public interface TestDelegate
{
[Export ("onSuccess:")]
void OnSuccess (string token);
}
[BaseType(typeof(NSObject),
Delegates = new string[] { "WeakDelegate" },
Events = new Type[] { typeof(TestDelegate) })
public interface Utility
{
[Wrap ("WeakDelegate")]
[NullAllowed]
TestDelegate Delegate { [Bind ("getTestDelegate")] get; [Bind ("setTestDelegate:")] set; }
[NullAllowed, Export ("delegate", ArgumentSemantic.Weak)]
NSObject WeakDelegate { [Bind ("getTestDelegate")] get; [Bind ("getTestDelegate:")] set; }
}
Когда я присоединяюсь только к событиям и не использую свойство делегата, события не запускаются.
Поправьте меня, если я ошибаюсь, но при использовании только событий, тогда ничто не относится к внутренне созданному _XDelegate, так что это будет сбор мусора сразу.
В моем случае мне пришлось хранить внутренний _XDelegate после присоединения к событиям, чтобы они работали.
public class TestClass
{
private readonly Delegate _del;
public TestClass()
{
iOS.SingletonInstance().OnSuccess += HandleOnSuccess;
_del = iOS.SingletonInstance().Delegate; //store Delegate instance to make events work
}
}
1 ответ
Решение
Проблема была где-то в другом - SingletonInstance() - это метод, а не свойство, поэтому ничто не ссылается на возвращаемый объект, поэтому он GCed.