Получение типа аргумента в методе

Я пытаюсь создать подкласс определенного класса и переопределить некоторые из его частных методов. Это опасно, может выйти из строя, не пройти проверку Apple (в AppStore), может иметь ужасные последствия и т. Д., Но это только для экспериментальных / образовательных целей :)

Например, скажем, я хочу знать тип первый аргумент метода экземпляра keyboardInput: shouldInsertText: isMarkedText: of UITextView :

SEL selector = @selector(keyboardInput:shouldInsertText:isMarkedText:);
Class class = [UITextView class];
Method method = class_getInstanceMethod(class, selector);
char *arg = method_copyArgumentType(method, 0);
printf("_%s_\n", arg);
free(arg);

Однако в консоли я получаю только _ @ _ . Я думаю, что @ означает объект , но объект какого класса? (Я думал, что получу имя класса аргумента) Можно ли получить класс этого параметра, используя другие функции времени выполнения objective-c или любое другое средство?

PS: В файле Пример Я использовал класс Какао Touch, но я мог бы попробовать то же самое с классом Какао. Так что это не должно быть специфичным для iOS.

РЕШЕНИЕ:

Я пробовал в симуляторе то, что предложил Дэйв, это сработало!

(gdb) info all-registers дал мне длинный список значений , ...

((gdb) po *(id*)($ebp + 8)
; contentOffset: {0, 0}>

(gdb) p *(SEL*)($ebp + 12)
$5 = (SEL) 0xbd19

(gdb) po *(id*)($ebp + 16)
>

(gdb) po *(id*)($ebp + 20)
t

(gdb) p *(id*)($ebp + 24)
$6 = (id) 0x0

Что имеет смысл, поскольку нажатая мной клавиша была единственной буквой «t», поэтому она не была помечена как текст («0x0»), поэтому я могу думать, что первый аргумент должен иметь тип UIWebDocumentView .

Всего одна мелочь (не имеющая отношения к данному случаю), как я могу получить имя метода из SEL в gbd? например $ 5 ?

5
задан nacho4d 16 July 2011 в 06:17
поделиться

0 ответов