2011-04-07 9 views
10

मुझे समझ में नहीं आता है कि हमें विधि NSInvocation ऑब्जेक्ट्स पर क्यों कॉल करना है जब वह जानकारी invocationWithMethodSignature के माध्यम से पहले ही पार हो गई है।NSInvocation क्लास पर setSelector विधि का उद्देश्य क्या है?

SEL someSelector; 
NSMethodSignature *signature; 
NSInvocation *invocation; 

someSelector = @selector(sayHelloWithString:); 

//Here we use the selector to create the signature 
signature = [SomeObject instanceMethodSignatureForSelector:someSelector]; 
invocation = [NSInvocation invocationWithMethodSignature:signature]; 

//Here, we again set the same selector 
[invocation setSelector:someSelector]; 
[invocation setTarget:someObjectInstance]; 
[invocation setArgument:@"Loving C" atIndex:2]; 

सूचना है कि हम [invocation setSelector:someSelector]; के लिए फिर से [SomeObject instanceMethodSignatureForSelector: someSelector]; को चयनकर्ता पारित कर दिया और:

एक NSInvocation वस्तु हम निम्न कार्य बनाने के लिए।

क्या मुझे कुछ याद आ रही है?

+1

+1 - यहां एक प्रश्न देखने के लिए अच्छा है जिसे पहले से दस लाख बार नहीं पूछा गया है (और उत्तर दिया गया है), और अविश्वसनीय तत्काल संदेश शब्दकोष में लिखा नहीं गया है। :-) –

+0

एक छोटा सा बिंदु: 'हस्ताक्षर = [कुछ ऑब्जेक्ट इंस्टेंस मोडस हस्ताक्षरफॉर चयनकर्ता: कुछ चयनकर्ता]; 'या तो' हस्ताक्षर = [[कुछ ऑब्जेक्ट क्लास] उदाहरण होना चाहिए विधि हस्ताक्षरफोर चयनकर्ता: कुछ चयनकर्ता]; या हस्ताक्षर = [कुछ ऑब्जेक्ट विधि सिग्नेचरफॉर चयनकर्ता: कुछ चयनकर्ता]; ' – Brynjar

उत्तर

8

एक हस्ताक्षर एक चयनकर्ता नहीं है। एक चयनकर्ता एक संदेश का नाम है। हस्ताक्षर पैरामीटर और वापसी मूल्य को परिभाषित करता है। आप एक ही हस्ताक्षर के साथ कई चयनकर्ता हो सकते हैं, और इसके विपरीत। यदि आप NSMethodSignature देखते हैं, तो आप ध्यान दें कि -selector विधि नहीं है; हस्ताक्षर एक विशेष चयनकर्ता के आसपास नहीं ले जाते हैं।

निम्नलिखित

- (void)setLocation:(CGFloat)aLocation; 
- (void)setLocation:(MyLocation*)aLocation; 

वे एक ही चयनकर्ता @selector(setLocation:), लेकिन अलग हस्ताक्षर है पर विचार करें।

- (void)setX:(CGFloat)x; 
- (void)setY:(CGFloat)y; 

ये समान हस्ताक्षर हैं, लेकिन विभिन्न चयनकर्ता हैं।

Selectors ओबीजेसी प्रोग्रामिंग भाषा से यह समझने के लिए एक उपयोगी संदर्भ हो सकता है।

+0

जबकि मैं जो कह रहा हूं उसे प्राप्त करता हूं, भाषा में थोड़ी सी अनावश्यकता प्रतीत होती है। मैं चयनकर्ता को दो बार सेट कर रहा हूं (एक बार हस्ताक्षर में, और एक बार फिर आमंत्रण उदाहरण पर)। मैं व्यक्तिगत रूप से (आईएमएचओ) सोचता हूं कि यह चयनकर्ता से प्राप्त करने के लिए अधिक सक्षम होगा (जो मेरे मामले में हस्ताक्षर से 'कुछ चयनकर्ता' में परिभाषित किया गया था)। – haroldcampbell

+0

आप हस्ताक्षर से चयनकर्ता नहीं प्राप्त कर सकते हैं। आप लक्ष्य से पूछकर एक लक्ष्य और चयनकर्ता से हस्ताक्षर प्राप्त कर सकते हैं (याद रखें, नई विधियों और कक्षाओं को रनटाइम पर बनाया जा सकता है; आप संकलन समय पर इनमें से कोई भी निर्धारित नहीं कर सकते हैं)।आप सही हैं कि '+ आमंत्रण हो सकता है लक्ष्य: चयनकर्ता: तर्क: 'शॉर्टकट विधि (मेरी टीम में एक श्रेणी है जो कुछ समान जोड़ती है)। यह अधिक कुशल नहीं होगा क्योंकि यह केवल उस कोड को कॉल करेगा जिसे आप कॉल कर रहे हैं, लेकिन यह थोड़ा और सुविधाजनक होगा। –

3

एक विधि हस्ताक्षर केवल रिटर्न प्रकार, और संख्याओं और तर्कों के प्रकार को परिभाषित करता है। इसमें चयनकर्ता नाम के बारे में कुछ भी शामिल नहीं है। उदाहरण के लिए, इन तरीकों में से सभी विभिन्न चयनकर्ताओं होने के बावजूद एक ही हस्ताक्षर है:

-(void) foo:(NSString*)fooString; 
-(void) bar:(NSString*)barString; 
-(void) baz:(NSString*)bazString; 
0

इससे एक साइड-जवाब की तरह है, लेकिन तथ्य यह है कि आप निम्नलिखित कर सकते हैं मुझे बेहतर विधि के बीच अलगाव को समझने में मदद हस्ताक्षर और चयनकर्ताओं। और UIPopoverController के dismissPopoverAnimated:

इस कोड को एक दृश्य नियंत्रक

NSMethodSignature *sig = nil; 
sig = [[self class] instanceMethodSignatureForSelector:@selector(viewDidAppear:)]; 
NSInvocation *myInvocation = nil; 
myInvocation = [NSInvocation invocationWithMethodSignature:sig]; 

[myInvocation setTarget:_somePopoverController]; 
[myInvocation setSelector:@selector(dismissPopoverAnimated:)]; 
BOOL animate = YES; 
[myInvocation setArgument:&animate atIndex:2]; 
[myInvocation invoke]; 

UIViewController के viewDidAppear के बाद से भीतर है दोनों एक BOOL तर्क लेने के लिए और शून्य लौटने के लिए, आप एक चयनकर्ता का उपयोग करके विधि हस्ताक्षर बना सकते हैं, लेकिन मंगलाचरण भेज अन्य को।

संबंधित मुद्दे