2010-11-28 7 views
14

मैं एक वर्गआईफोन - प्रदर्शन चयनकर्ता: withObject: afterDelay: 'प्रोटोकॉल में नहीं मिला है? '-performSelector: withObject: afterDelay:'

[delegate performSelector:@selector(doStuff:) withObject:myObject afterDelay:2.0]; 

और मैं इस त्रुटि

चेतावनी हो रहा है अंदर यह है नहीं प्रोटोकॉल (रों)

में पाया

मैं यह नहीं समझ सकता कि क्या गलत हो सकता है।

कोई सुराग?

धन्यवाद।

उत्तर

30

आपकी समस्या यह है कि आप के रूप में अपने प्रतिनिधि उदाहरण चर घोषित किया है:

id<SomeProtocol> delegate; 

है न? खैर, इसका मतलब है कि संकलन-समय परीक्षक केवल <SomeProtocol> प्रोटोकॉल में विधियों की तलाश करेगा। हालांकि, performSelector:withObject:afterDelay: को NSObject पर घोषित किया गया है। इसका मतलब यह है कि आप इवर के रूप में घोषित करना चाहिए:

NSObject<SomeProtocol> * delegate; 

यह कह रहा है कि यह एक NSObject<SomeProtocol> है कि अनुरूप है, के रूप में किसी भी वस्तु है कि <SomeProtocol> के अनुरूप करने के लिए विरोध किया जाना चाहिए। यह आपकी चेतावनी से छुटकारा पाना चाहिए, और आपको कोई कास्टिंग करने की ज़रूरत नहीं है। हालांकि

+1

बिल्कुल सही! बस!!!!!! – SpaceDog

+0

@ डेव मैंने शायद किसी और से अधिक से आपके उद्देश्य पर उद्देश्य-सी के बारे में और अधिक सीखा है! धन्यवाद! –

+1

@ जैकोब आपका बहुत स्वागत है :) –

3

कास्टिंग अपने वर्ग 'प्रकार के लिए प्रतिनिधि पहले कोशिश करें, फिर performSelector:withObject:afterDelay आह्वान:

[(SomeClass *) delegate performSelector:@selector(doStuff:) withObject:myObject afterDelay:2.0]; 

मानते हुए अपने delegate प्रकार id की है, आप क्रम कि वास्तव में वस्तु NSObject से विरासत है बताने की आवश्यकता (जहां performSelector:withObject:afterDelay: विधि परिभाषित की गई है) इसे इसे वर्ग के प्रकार में कास्ट करके।

+1

कोई ऑब्जेक्ट हमेशा एनएसओब्जेक्ट से प्राप्त होगा (सब कुछ करता है, यह एक मूल वर्ग है)। मुझे लगता है कि आप NSObject प्रोटोकॉल के अनुरूप हैं। –

+1

@ ईवन सब कुछ * एनएसओब्जेक्ट से प्राप्त नहीं होता है। और 'प्रदर्शन चयनकर्ता: ऑब्जेक्ट के साथ: बाद में: 'NSObject' प्रोटोकॉल में परिभाषित नहीं किया गया है, इसे' NSObject' कक्षा में परिभाषित किया गया है। –

+1

कास्टिंग ब्रेक encapsulation। क्या होगा यदि यह एक वर्ग के लिए है जहां प्रतिनिधि का प्रकार अज्ञात है? –

2

आपको प्रतिनिधि वस्तु को वास्तविक वर्ग में डालने की आवश्यकता है ताकि आप विधियों के लिए काम कर रहे हों। प्रतिनिधि को देखा केवल प्रोटोकॉल में परिभाषित विधियों को दिखा सकता है। प्रदर्शन चयनकर्ता: withObject: प्रोटोकॉल में परिभाषित एक विधि नहीं है।

[(CLASS*)delegate performSelector:@selector(doStuff:) withObject:myObject afterDelay:2.0]; 
1
[NSTimer scheduledTimerWithTimeInterval:2 
    target:self 
    selector:@selector(doStuff) 
    userInfo:nil 
    repeats:NO]; 

प्रयास करें कि यह मानते हुए कि तुम सिर्फ चाहते हैं एक टाइमर

3

NSObject * डाली डेव लाया काम करेंगे, वहाँ एक क्लीनर वैकल्पिक तरीका लोगों प्रोटोकॉल का उपयोग के रूप में वे उम्मीद करेंगे देता है कि है - आप प्रोटोकॉल की घोषणा यह NSObject प्रोटोकॉल का समर्थन करता हो सकता है।

एनएसओब्जेक्ट केवल एक कार्यान्वयन नहीं है बल्कि एक प्रोटोकॉल भी है जिसमें सभी प्रदर्शन चयनकर्ता शामिल हैं: विधि प्रकार। तो आप बस अपने प्रोटोकॉल में घोषणा कर सकते हैं कि आप NSObject समर्थन आप किसी भी अन्य वर्ग एक प्रोटोकॉल का समर्थन करने की तरह:

@protocol MyProtocol <NSObject> 

और संकलक चेतावनी (यह मानते हुए आप आयात किया है प्रोटोकॉल परिभाषा) गायब हो जाएगा।

ध्यान दें कि इसका मतलब यह है कि आपके प्रोटोकॉल के समर्थन की घोषणा करने वाले किसी भी व्यक्ति को आगे बढ़ना होगा एनएसओब्जेक्ट होना चाहिए या कई तरीकों का उत्तराधिकारी होना चाहिए। लेकिन आईफोन प्रोग्रामिंग में उपयोग की जाने वाली सभी कक्षाएं व्यावहारिक विचारों के कारण एनएसओब्जेक्ट से ली गई हैं, इसलिए आम तौर पर यह कोई मुद्दा नहीं है।

संपादित करें:

यह पता चला -performSelector:withObject:afterDelay: NSObject प्रोटोकॉल (बिना किसी देरी के होते हैं) में नहीं है। चूंकि यह आपके प्रोटोकॉल का उपयोग करने वाले सभी लोगों के लिए अभी भी अच्छा है, अगर वे प्रोटोकॉल प्रकार का संदर्भ देने के लिए आईडी का उपयोग कर सकते हैं, तो भी मैं इसे हल करने के लिए प्रोटोकॉल का उपयोग करूंगा - लेकिन आपको स्वयं को NSObject प्रोटोकॉल में एक एक्सटेंशन घोषित करना होगा। तो आपकी फ़ाइल के लिए हेडर में आप कुछ जोड़ सकते हैं:

@protocol MyProtocolNSObjectExtras <NSObject> 
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; 
@end 

@protocol MyProtocol <NSObjectExtras> 
.... 
@end 

फिर आपको पहले जैसा वर्णन किया गया वही लाभ मिलता है।

+0

यह इस मामले में काम नहीं करेगा (मैंने कोशिश की है), क्योंकि प्रश्न में विधि 'एनएसओब्जेक्ट' पर परिभाषित की गई है, न कि '' –

+0

आह, मैं देखता हूं कि आपका क्या मतलब है - मैंने देखा कि प्रोटोकॉल ने प्रदर्शन किया है चयनकर्ता: ऑब्जेक्ट के साथ और माना जाता है कि इसके बाद भी था: ar स्मारक संस्करण भी ... मैं अभी भी एक प्रोटोकॉल का उपयोग करता हूं, मैं अपना जवाब ठीक कर दूंगा। –

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

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