2010-03-02 5 views
6

मेरे पास एक कक्षा है जो गतिशील रूप से कार्यान्वयन विधियों के लिए resolveInstanceMethod का उपयोग करती है। जब मैं कोड के अन्य हिस्सों से गतिशील रूप से कार्यान्वित तरीकों को कॉल करता हूं, तो संकलक एक चेतावनी उत्सर्जित करता है कि ऑब्जेक्ट चयनकर्ता को प्रतिक्रिया नहीं दे सकता है। मैं चाहता हूं कि संकलक इस वर्ग के लिए ऐसी चेतावनियों को उत्सर्जित न करें, लेकिन जब मैं अन्य वर्गों पर एक अमान्य चयनकर्ता का आह्वान करता हूं तो मैं चेतावनियों को दबाना नहीं चाहता हूं। क्या यह संभव है?मैं संकलक को कैसे बता सकता हूं कि मेरी कक्षा गतिशील रूप से विधियों को हल करती है?

उत्तर

7

मान लिया जाये कि आप विधि हस्ताक्षर जो गतिशील संकलन समय पर समाधान हो जाएगा पता है, तुम उन्हें घोषणा कर सकते हैं एक अनौपचारिक श्रेणी में।

यदि आप हस्ताक्षर नहीं जानते हैं - यदि विधि नाम गतिशील भी हैं - तो आपको -performSelector: (या एकल या डबल ऑब्जेक्ट तर्क प्रकार) का उपयोग करने की आवश्यकता होगी या आप शायद उपयोग करना चाहेंगे एनएसआईएनवोकेशन, जब तक प्रदर्शन एक प्रमुख चिंता नहीं है (यदि ऐसा है, तो ऐसे वैकल्पिक समाधान हैं जो काफी अधिक स्पष्ट रूप से हैं)।

+0

एक अनौपचारिक प्रोटोकॉल पूरी तरह से मेरी समस्या हल करता है। –

4

उपयोग performSelector:

यह प्राप्तकर्ता के लिए सीधे एक संदेश भेजने के बराबर है, तथापि, यह आपको लगता है कि क्रम जब तक निर्धारित नहीं कर रहे हैं संदेश भेजने के लिए अनुमति देता है।

अपने तरीके से एक या दो तर्क ले, तो आप इस विधि की बहनों का उपयोग कर सकते हैं: – performSelector:withObject: और – performSelector:withObject:withObject:

अपने तरीके से अधिक दो तर्क, या तर्कों के ऑब्जेक्ट प्रकार के नहीं हैं, तो, इस सवाल का जवाब है अनुकूल नहीं है। एक कार्यान्वयन प्रदान करने के लिए कोई ज़रूरत नहीं

@interface MyDynamicallyResolvingClass(MethodsThatWillResolveAtRuntime) 
... declare the methods here ... 
@end 

:

+0

यह केवल उन विधियों के लिए काम करता है जो 0, 1, या 2 ऑब्जेक्ट प्रकार तर्क लेते हैं। वास्तव में – bbum

+0

। इस सीमा को स्पष्ट करने के लिए उत्तर संपादित किया। – Guillaume

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