Я могу вызвать метод частного API с помощью getClassFromString:
и performSelector:
в Objective-C или использовать библиотеку Dynamic, чтобы легко вызывать их в Swift. Однако я не могу установить делегата для частного API, поскольку не могу динамически получить протокол и заставить класс соответствовать ему.
Я попытался скопировать определение протокола и привести класс в соответствие с ним, а затем использовал [/*id*/ performSelector:NSSelectorFromString(@"setDelegate") withObject:[[MyDelegate alloc] init]];
в Objective-C. Но, похоже, никакого эффекта.
Objective-C на самом деле не волнует, соответствует ли объект, который устанавливается в качестве делегата, протоколу. Если этого не произойдет, произойдет сбой во время выполнения, но пока ваш класс правильно реализует методы протокола, вы можете назначить его в качестве делегата.
Скорее всего, с вашим кодом происходит то, что делегат частного класса объявлен weak
и, поскольку ничто другое его не удерживает, он немедленно освобождается.
Если вы сохраните строгую ссылку на MyDelegate
, а затем назначите ее частному классу, это, скорее всего, сработает.
Вы можете получить протокол динамически с помощью функций времени выполнения Objective-C.