Я вважаю, що найшвидший (але дещо брудний) спосіб зробити це шляхом виклику objc_msgSend безпосередньо. Однак викликати це безпосередньо небезпечно, тому що вам потрібно прочитати документацію та переконатися, що ви використовуєте правильний варіант для типу повернутого значення і тому, що objc_msgSend визначається як vararg для зручності компілятора, але насправді реалізується як клей швидкої збірки . Ось якийсь код, який використовується для виклику методу делегата - [delegate integerDidChange:], який приймає єдиний цілий аргумент.
#import <objc/message.h>
SEL theSelector = @selector(integerDidChange:);
if ([self.delegate respondsToSelector:theSelector])
{
typedef void (*IntegerDidChangeFuncPtrType)(id, SEL, NSInteger);
IntegerDidChangeFuncPtrType MyFunction = (IntegerDidChangeFuncPtrType)objc_msgSend;
MyFunction(self.delegate, theSelector, theIntegerThatChanged);
}
Це вперше зберігає селектор, оскільки ми збираємося посилатися на нього кілька разів, і було б легко створити помилку друку. Потім він перевіряє, що делегат насправді відповідає селектору - це може бути необов'язковий протокол. Потім створюється тип вказівника функції, який визначає фактичну підпис селектора. Майте на увазі, що всі повідомлення Objective-C мають два прихованих перших аргументу, обмінюється об'єктом та відправляється селектором. Потім ми створюємо покажчик функції відповідного типу і встановлюємо його, щоб вказувати на основну функцію objc_msgSend. Майте на увазі, що якщо значення, що повертається, є плаваючою або структурою, вам потрібно використовувати інший варіант objc_msgSend. Нарешті, надішліть повідомлення за допомогою тих же механізмів, які використовує Objective-C під аркушами.