Использование method_getReturnType для вызова определенных типов функций-членов экземпляра - PullRequest
0 голосов
/ 16 февраля 2019

Я новичок в Objective-C, поэтому у меня нет особого представления о языке.

Я пытаюсь пройтись по всем доступным методам экземпляра объекта и вызвать ихкоторые не принимают аргументов, возвращают bool и начинают со строки «func».

Вот как я получаю методы:

uint32_t methodCount = 0;
Method * methods = class_copyMethodList(object_getClass(self), &methodCount);

Я перебираю методы, и когда вышеуказанное условие соответствует,попробуйте вызвать их:

NSString * methodName   = [NSString stringWithUTF8String:sel_getName(method_getName(method))];

char retTyp[10];
method_getReturnType(method, retTyp, 10);

const char * desiredRetType = "B";

if([methodName hasPrefix:@"func"] &&
   (0 == strncmp(retTyp, desiredRetType, strlen(desiredRetType))) &&
   (2 == method_getNumberOfArguments(method)))
{
     bool * (* testMethod) (id, Method) = (void (*) (id, Method, ...)) method_invoke;
     result = testMethod(self, method);
}

Я должен был экспериментально выяснить, что такое строка возвращаемого типа (получается, что это "B" для bool) и количество аргументов.

Iполучаю следующую ошибку в строке, где я пытаюсь вызвать функцию с помощью method_invoke:

cannot initialize a variable of type 'bool *(*)(__strong id, Method)' (aka 'bool *(*)(__strong id, objc_method *)') with an rvalue of type 'void (*)(__strong id, Method, ...)' (aka 'void (*)(__strong id, objc_method *, ...)'): different return type ('bool *' vs 'void') 
  1. Есть ли лучший способ сделать это, чем class_copyMethodList?
  2. Как правильно преобразовать функцию, чтобы не получить ошибку?
  3. Возможно ли, что method_getReturnType () преобразование типов возврата может измениться от системы к системе?Или это всегда B для bool?

1 Ответ

0 голосов
/ 16 февраля 2019

NVM, я разобрался.Вместо того, чтобы использовать method_invoke для имени метода, я сделал это:

NSString * methodName   = [NSString stringWithUTF8String:sel_getName(method_getName(method))];

char retTyp[10];

method_getReturnType(method, retTyp, 10);
const char * desiredRetType = "B";

if([methodName hasPrefix:@"func"] &&
   (0 == strncmp(retTyp, desiredRetType, strlen(desiredRetType))) &&
   (2 == method_getNumberOfArguments(method)))
{
    SEL testMethod = method_getName(method);
    return [self performSelector:testMethod];
}
...