Я пытаюсь создать подкласс определенного класса и переопределить некоторые из его частных методов. Это опасно, может выйти из строя, не пройти проверку 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
?