2009-02-12 12 views
24

मैं कोको/कोको टच के लिए नया हूं, और विकास पुस्तक के माध्यम से काम कर रहा हूं। मैं उन परिस्थितियों में आया हूं जहां @selector() ऑपरेटर का उपयोग किया जाता है। मैं थोड़ा और खो गया हूं कि @selector() ऑपरेटर का उपयोग कैसे किया जाना चाहिए। क्या कोई एक छोटा और मीठा स्पष्टीकरण प्रदान कर सकता है और इसका उपयोग क्यों किया जाता है और डेवलपर को क्या लाभ होता है?कोको @ चयनकर्ता उपयोग का स्पष्टीकरण

वैसे, यहाँ नमूना कोड एप्पल iPhone विकास साइट से लिया @selector()

if ([elementName isEqualToString:@"entry"]) 
{ 

    parsedEarthquakesCounter++; 

    // An entry in the RSS feed represents an earthquake, so create an instance of it. 
    self.currentEarthquakeObject = [[Earthquake alloc] init]; 
    // Add the new Earthquake object to the application's array of earthquakes. 
    [(id)[[UIApplication sharedApplication] delegate] 
      performSelectorOnMainThread:@selector(addToEarthquakeList:) 
      withObject:self.currentEarthquakeObject waitUntilDone:YES]; 
    return; 
} 
+0

संभव डुप्लिकेट [? कैसे कर एसईएल और iPhone SDK में @selector काम] (http://stackoverflow.com/questions/297680/how-do-:

[myObject performSelector:@selector(runMYmethod:) withObject:parameters]; 

के बराबर है sel-and-selector-work-in-iphone-sdk) – Monolo

उत्तर

40

चयनकर्ता ऑपरेटर एक तरह से एक वस्तु द्वारा प्रदान की एक विधि का उल्लेख करने के प्रदान करता है, कुछ हद तक के लिए इसी तरह का उपयोग करता है सी में एक फ़ंक्शन पॉइंटर। यह उपयोगी है क्योंकि यह आपको ऑब्जेक्ट पर कॉलिंग विधियों की प्रक्रिया को कम करने की अनुमति देता है। उदाहरण के लिए कोड का एक टुकड़ा एक विधि प्रदान कर सकता है, और कोड का एक और टुकड़ा उस विधि को ऑब्जेक्ट्स के दिए गए सेट पर लागू कर सकता है।

उदाहरण: एक वस्तु एक निश्चित विधि को लागू करता है, तो

टेस्ट को देखने के लिए:

[object respondsToSelector:@selector(methodName)] 

स्टोर एक विधि बाद में एक वस्तु पर कॉल करने के लिए;

SEL method = @selector(methodName); 
[object performSelector:method]; 

एक अलग थ्रेड (जीयूआई काम के लिए उपयोगी) पर एक विधि को कॉल करें।

[object performSelectorOnMainThread:@selector(methodName)] 
+3

स्पष्टीकरण के लिए धन्यवाद - क्या आप पारंपरिक तरीके से एक विधि को कॉल करने के बजाय इसका उपयोग क्यों करेंगे, यह मानते हुए कि आप जानते हैं कि ऑब्जेक्ट उस विधि का समर्थन करता है ? – lupefiasco

+9

@ लूफिफियास्को: [ऑब्जेक्ट प्रदर्शन सिलेक्टर इनबैकग्राउंड: @ सेलेक्टर (विधिनाम)] के परिणामस्वरूप विधि के लिए एक असीमित कॉल होगा। – codelogic

+10

एक और उपयोग केस यह है कि यदि आपके पास चयनकर्ता का नाम स्ट्रिंग के रूप में है, तो आप रनटाइम पर ऐसा कर सकते हैं, जैसे कुछ [ऑब्जेक्ट प्रदर्शन चयनकर्ता: NSSelectorFromString (कुछ) ...] – codelogic

2

@selector() हर बार जब आप किसी अन्य पद्धति का एक समारोह के लिए या एक चर मूल्य के रूप में एक तर्क के रूप में एक विधि का नाम उत्तीर्ण करने की आवश्यकता प्रयोग किया जाता है। सीधे नाम पास करना उद्देश्य-सी में काम नहीं करता है।

4

क्या कहा गया है के अलावा, आप भी बाद में उपयोग के लिए एक NSInvocation में @selector लपेट कर सकते हैं। आप एनएसआईएनवोकेशन में तर्कों के निर्माण के बाद लंबे समय तक तर्क सेट कर सकते हैं, और जब आपको संदेश निकालने की आवश्यकता होती है तो इसे सक्रिय करें। यह आपको बहुत सारी शक्ति देता है।

अवधारणा के परिचय के लिए, स्कॉट स्टीवंसन के पास "Dynamic Objective-C with NSInvocation" नामक एक महान पोस्ट है।

2

एक व्यावहारिक उदाहरण validateMenuItem विधि है जहां मेनू आइटम को उनके लक्षित कार्यों के साथ पहचाना जाता है।

सरलीकृत उदाहरण:

- (BOOL)validateMenuItem:(NSMenuItem *)item { 
    if ([item action] == @selector(selectFiles:) && otherCondition) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 
0

आप एक पर एक विधि को लागू करने के लिए एक का भी उपयोग करेंगे वस्तु इस कोको में लक्ष्य कार्रवाई डिजाइन पैटर्न के कार्यान्वयन के लिए आधार प्रदान करता है।

[myObject runMYmethod:parameters]; 
की
संबंधित मुद्दे