मैं सिर्फ उद्देश्य-सी के "संदेश-अग्रेषण" का अध्ययन कर रहा हूं। मैं यह सत्यापित करने के लिए एक परीक्षण प्रोग्राम लिखता हूं कि क्या मैं रन-टाइम पर एक अपरिचित चयनकर्ता को "निगल" सकता हूं। तो मैंने यह किया:संदेश-अग्रेषण द्वारा मैं "अपरिचित चयनकर्ता त्रुटि" को कैसे "निगल सकता हूं"?
- (void) forwardInvocation: (NSInvocation *) anInvocation {
if ([anInvocation selector] == @selector(testMessage)){
NSLog(@"Unknow message");
}
return;
}
लेकिन यह अभी भी रन टाइम पर "अपरिचित चयनकर्ता" त्रुटि फेंकता है। संकल्प खोज के बाद मुझे पता है कि मैं विधि ओवरराइड करने के लिए की जरूरत है "methodSignatureForSelector:", तो मैं एक और प्रॉक्सी वर्ग "प्रॉक्सी" कहा जाता है और निम्न विधि लिखें:
(NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
if ([Proxy instancesRespondToSelector: selector]) {
return [Proxy instanceMethodSignatureForSelector: selector];
}
return [super methodSignatureForSelector:selector];
}
लेकिन, वास्तव में, मैं लागू करने के लिए नहीं करना चाहते हैं इस विधि को पूरा करने के लिए ऐसी अन्य प्रॉक्सी कक्षा। मैं बस इतना करना चाहता हूं कि इस अज्ञात चयनकर्ता को अनदेखा करें। लेकिन अगर मैं सिर्फ इस टाइप करें, यह काम नहीं करता:
(NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
return [super methodSignatureForSelector:selector];
}
तो, मुझे आश्चर्य है कि क्या कोई तरीका है कि बस "निगल" इस त्रुटि कर सकते हैं? (अपवाद हैंडलर का उपयोग नहीं करते, मैं एक "अग्रेषण" जैसा तरीका चाहता हूं)। धन्यवाद!
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
NSMethodSignature *sig = [super methodSignatureForSelector:selector];
if (!sig) {
if (selector == @selector(testMessage)) {
// Create a signature for our fake message.
sig = [NSMethodSignature signatureWithObjCTypes:"@:"];
}
}
return sig;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
// Do whatever you want with the invocation.
}
सबसे बड़ी समस्या signatureWithObjCTypes:
को तर्क हो रहा है:
सीएफ। http://stackoverflow.com/a/11531609/ –