में तर्क प्रकार प्राप्त करना मैं एक निश्चित वर्ग को उपclass करने और अपने कुछ निजी तरीकों को ओवरराइड करने का प्रयास कर रहा हूं। यह खतरनाक है, असफल हो सकता है, ऐप्पल की समीक्षा (ऐपस्टोर में) को पार नहीं कर सका, भयानक प्रभाव हो सकता है, लेकिन यह सिर्फ प्रयोगात्मक/शैक्षणिक उद्देश्यों के लिए है :)एक विधि
उदाहरण के लिए मान लें कि मैं इस प्रकार को जानना चाहता हूं उदाहरण विधि UITextView
की keyboardInput:shouldInsertText:isMarkedText:
का पहला तर्क की:
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);
हालांकि कंसोल में मैं केवल [email protected]_
मिलता है। मुझे लगता है कि @
का अर्थ है ऑब्जेक्ट लेकिन किस वर्ग का ऑब्जेक्ट? (मैंने सोचा कि मुझे तर्क के वर्ग का नाम मिलेगा) क्या objective-c runtime functions या किसी अन्य माध्यम का उपयोग करके उस पैरामीटर की कक्षा प्राप्त करना संभव है?
पीएस: उदाहरण में मैंने कोको स्पर्श की एक कक्षा का उपयोग किया लेकिन मैं कोको के एक वर्ग के साथ बिल्कुल वही कोशिश कर सकता था। तो यह आईओएस के लिए विशिष्ट नहीं होना चाहिए।
हल:
मैं सिम्युलेटर क्या डेव सुझाव में की कोशिश की है, यह काम किया!
(gdb) info all-registers
मुझे मूल्यों की एक लंबी सूची है, ...
((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
कौन समझ में आता है के बाद से कुंजी मैं दबाया एक एकल "टी" था तो यह पाठ चिह्नित नहीं किया गया था ("0x0") तो मैं दे दी है यह सोचने के लिए ठीक है कि पहला तर्क UIWebDocumentView
प्रकार होना चाहिए।
बस एक छोटी सी चीज (इस मामले में अप्रासंगिक), मैं जीबीडी में एसईएल से विधि का नाम कैसे प्राप्त कर सकता हूं? उदाहरण के लिए $5
?
'एसईएल' * * विधि का नाम है। सी स्ट्रिंग के रूप में चयनकर्ता प्राप्त करने के लिए 'sel_getName' फ़ंक्शन का उपयोग करें; http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/ भी देखें। 'NSStringFromSelector' भी है, जो वास्तव में यह कहता है, और यह (और दस्तावेज में) फाउंडेशन का हिस्सा है। –