2009-07-05 13 views
7

लिए मैं सेटअप करने के लिए एक विधि प्रेषण तालिका चाहते हैं और मैं सोच रहा हूँ अगर यह संभव है ऑब्जेक्टिव-सी में एक पद्धति के लिए सूचक बनाने के लिए (सूचक की तरह सी में कार्य करने के लिए)। मैंने गतिशील रूप से विधियों को स्विच करने के लिए कुछ उद्देश्य-सी रनटाइम फ़ंक्शंस का उपयोग करने की कोशिश की लेकिन समस्या यह है कि यह सभी मामलों को प्रभावित करेगा।ऑब्जेक्टिव-सी के लिए ... सूचक विधि

जैसा कि मैं उद्देश्य-सी के लिए बहुत नया हूं, एक सचित्र उदाहरण की अत्यधिक सराहना की जाएगी।

उत्तर

16

उद्देश्य-सी विधियों को selector एस कहा जाता है, और SEL डेटाटाइप द्वारा दर्शाए जाते हैं। अपने वस्तु NSObject से विरासत हैं, तो आप (यानी एक विधि कॉल) इस प्रकार की तरह एक चयनकर्ता प्रदर्शन करने के लिए यह बता सकते हैं:

SEL selector = @selector(doSomething:); 
[obj performSelector:selector withObject:argument]; 

इसका मतलब यह है कि आप एक विधि परिभाषित जैसे कि:

-(void)doSomething:(MyObject*)arg; 

चयनकर्ता हैं @selector कीवर्ड है, जो विधि आप रखना चाहते हैं, उसके नाम लेता है के माध्यम से SEL डेटाटाइप्स को सौंपा। विधि का नाम सभी तर्कों से अलग विधि नाम है। उदाहरण के लिए:

-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params 

@selector(doSomething:withParams:) के रूप में संदर्भित किया जा चाहेंगे।

+0

ओह, ठीक है! जेसन, बहुत बहुत धन्यवाद! –

5

हाँ! उद्देश्य-सी में, फ़ंक्शन पॉइंटर्स को चयनकर्ता कहा जाता है। यदि आप एक विधि इस तरह परिभाषित किया गया है:

- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2 
{ 
} 

चयनकर्ता इस तरह घोषित किया जाता है:

@selector(myFunctionWithObject:otherObject:) 

एक वस्तु पर एक चयनकर्ता करने के लिए, आप का उपयोग कर सकते हैं:

[object performSelector:@selector(myFunction)]; 

या

[object performSelector:@selector(myFunctionTakingParameter:) withObject: o]; 

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

आपको यह ध्यान में रखना चाहिए कि उद्देश्य-सी पहले से ही पूरी तरह गतिशील विधि प्रेषण तालिका पर आधारित है। ऐसा लगता है कि चयनकर्ताओं का उपयोग करके फ़ंक्शन पॉइंटर्स को बनाए रखना आपके लिए ठीक काम करेगा यदि आपको किसी फ़ंक्शन के संदर्भ की आवश्यकता है।

+0

आप पढ़ने के लिए दूसरी वाक्य को बदलना चाहेंगे: यदि आपके पास इस तरह परिभाषित METHOD है। – micmoo

+0

बहुत बहुत धन्यवाद, बेन। हां, आप बिल्कुल सही हैं कि रनटाइम स्वयं पूरी तरह गतिशील पैच तालिका है। –

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