Tôi đang cố gắng phân lớp một lớp nhất định và ghi đè lên một số phương thức riêng của nó. Điều này là nguy hiểm, có thể thất bại, không thể vượt qua đánh giá của Apple (Trong AppStore), có thể có hiệu ứng khủng khiếp, vv, nhưng điều này chỉ dành cho mục đích thử nghiệm/giáo dục :)Nhận kiểu đối số theo phương thức
Ví dụ, giả sử tôi muốn biết loại của đối số đầu tiên của phương pháp dụ keyboardInput:shouldInsertText:isMarkedText:
của 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);
Tuy nhiên trong giao diện điều khiển tôi chỉ nhận được [email protected]_
. Tôi nghĩ rằng @
có nghĩa là đối tượng nhưng là đối tượng của lớp học nào? (Tôi nghĩ tôi sẽ lấy tên của lớp đối số) Có thể lấy lớp tham số đó bằng cách sử dụng objective-c runtime functions hoặc bất kỳ phương tiện nào khác không?
PS: Trong ví dụ tôi đã sử dụng một lớp học của Cocoa touch nhưng tôi có thể đã thử chính xác giống với một lớp Cocoa. Vì vậy, điều này không nên cụ thể cho iOS.
SOLVED:
Tôi đã thử trong trình mô phỏng những gì Dave gợi ý, nó hoạt động!
(gdb) info all-registers
đã cho tôi một danh sách dài các giá trị, ...
((gdb) po *(id*)($ebp + 8)
<MyTextView: 0x5911270; baseClass = UITextView; frame = (80 70; 240 323); text = 'Lorem ipsum dolor sit er ...'; clipsToBounds = YES; autoresize = RM+BM; layer = <CALayer: 0x5c0c7d0>; contentOffset: {0, 0}>
(gdb) p *(SEL*)($ebp + 12)
$5 = (SEL) 0xbd19
(gdb) po *(id*)($ebp + 16)
<UIWebDocumentView: 0xa02f000; frame = (0 0; 240 457); text = 'Lorem ipsum dolor sit er ...'; opaque = NO; userInteractionEnabled = NO; layer = <UIWebLayer: 0x5c35070>>
(gdb) po *(id*)($ebp + 20)
t
(gdb) p *(id*)($ebp + 24)
$6 = (id) 0x0
nào có ý nghĩa kể từ khi chính tôi ép là một single "t" nên nó không được đánh dấu văn bản ("0x0") vì vậy tôi là OK để nghĩ rằng đối số đầu tiên phải thuộc loại UIWebDocumentView
.
Chỉ một điều nhỏ (không thích hợp trong trường hợp này), làm thế nào tôi có thể lấy tên phương thức từ SEL trong gbd? ví dụ: $5
?
'SEL' * là * tên phương thức. Sử dụng hàm 'sel_getName' để lấy bộ chọn làm chuỗi C; xem thêm http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/. Ngoài ra còn có 'NSStringFromSelector', nó thực hiện chính xác những gì nó nói, và là một phần của (và được ghi trong) Foundation. –