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.

Другие вопросы по тегам