Метод виклику Objective C динамічно за допомогою рядка


74

Мені просто цікаво, чи є спосіб викликати метод, коли я будую ім'я методу на льоту за допомогою рядка.

наприклад, у мене є метод, який називається loaddata

-(void)loadData;

щоб зателефонувати цьому, я б зазвичай називав це як

[self loadData];

Але я хочу мати можливість викликати це динамічно за допомогою рядка, наприклад

NSString *methodName = [[NSString alloc] initWithString:@"loadData"];
[self methodName];

Це дурний приклад, але, сподіваюся, ви зрозуміли мою думку. Я використовую його для класів прив'язки даних, які я встановлюю для свого додатка IPad. Важко пояснити, але щоб змусити його спрацювати, мені потрібно розробити, як викликати метод із рядком.

Будь-які ідеї?

Дякую


1
+1 за чітке, просте запитання!
Linuxmint

Метод, який я хочу викликати, - це функція, яка повертає NSString.
IPadHackAndSlash

Відповіді:


108

Можна спробувати щось на зразок

SEL s = NSSelectorFromString(selectorName);
[anObject performSelector:s];

У цій ситуації метод повертає значення, яке в одному випадку є NSString. Я отримую повідомлення про помилку з вимовою Lvalue як лівий операнд присвоєння. Це мій код: SEL s = NSSelectorFromString (@ "getIDString"); [самотекст] = [boundEntity performSelector: s];
IPadHackAndSlash

що таке [self text], де ви призначаєте значення return getIDString.
Ішу

[boundEntity performSelector:s]повертає значення типу, яке не відповідає типу [self text]. Я думаю, вам потрібно встановити @property для тексту та дзвінка [self setText:[[boundEntity performSelector:s]]].
shreyasva

9
performSelector може спричинити витік, оскільки селектор невідомий!
malhal


12

Ви можете використовувати функцію objc_msgSend. Потрібні два параметри - приймач і селектор, щоб надіслати на нього:

objc_msgSend(self, someSelector);

Вам потрібно буде перетворити рядок у відповідний селектор, використовуючи NSSelectorFromString:

NSString *message = [self getSomeSelectorName];
objc_msgSend(self, message);

Метод також приймає змінну кількість аргументів, тому ви можете надсилати повідомлення з будь-якою кількістю аргументів.

NSString *message = [self getSomeSelectorNameWithManyArguments];
objc_msgSend(self, message, arg1, arg2, arg3, arg4);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.