2012-01-13 10 views
14

एआरसी माइग्रेशन टूल प्रवास के साथ शुरू करने से पहले इस कोड को स्वीकार करने से इनकार कर रहा है:"चयनकर्ता के लिए कोई ज्ञात उदाहरण विधि नहीं 'निष्पादित करने के लिए कैसे करें चयनकर्ता: withObject: afterDelay:'" जब एआरसी में माइग्रेट हो रहा है?

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0]; 

प्रतिनिधि एक प्रोटोकॉल के साथ इस पद्धति लागू करने के लिए मजबूर किया जाता है, और यह ठीक काम करना चाहिए:

@protocol OverlayDelegate <NSObject> 
- (void)overlayDismissed:(Overlay*)overlay; 
@end 

@interface Overlay : UIImageView { 
    id<OverlayDelegate> delegate; 
} 

@property (nonatomic, assign) id<OverlayDelegate> delegate; 

एआरसी के साथ क्या गलत है? यह मुझे क्यों बता रहा है कि "चयनकर्ता के लिए कोई ज्ञात उदाहरण विधि नहीं है" चयनकर्ता: withObject: afterDelay: '?

उत्तर

16

एआरसी इसका कारण नहीं बना रहा है - यह केवल इसे उजागर कर रहा है। यह विधि NSObject पर परिभाषित है - लेकिन आईडी सिर्फ NSObject (ताकि आप सिर्फ 'आईडी' की तुलना में अधिक विशिष्ट होना) से अधिक के लिए काम करता है इस के लिए अपने कोड में परिवर्तित करें:।

@interface Overlay : UIImageView { 
    NSObject<OverlayDelegate> *delegate; 
} 

@property (nonatomic, assign) NSObject<OverlayDelegate> *delegate; 
+0

तो इसका मतलब है कि एआरसी के तहत उन दिनों जहां हम प्रतिनिधियों को आईडी के रूप में घोषित करते हैं? बस इसके बजाय NSObject पर भरोसा करते हैं? (मेरे लिए जो किसी भी तरह से समझ में आता है) – openfrog

+1

एआरसी स्मृति प्रबंधन उद्देश्यों के लिए इन चीजों को लागू करता है। यदि आप जानते हैं कि आपका प्रतिनिधि एनएसओब्जेक्ट प्रकार का होगा - तो बस यह बताएं कि यह समस्या दूर हो गई है। – dtuckernet

+0

या फिर भी 'आईडी' का उपयोग करें और' NSObject' से विधियों का उपयोग न करें। आप 'NSObject' से विधियों का उपयोग क्यों कर रहे हैं? क्या यहां कोई आवश्यकता है? – mattjgalloway

0

मैं समझ गए होंगे कि NSObject * के लिए प्रतिनिधि कास्टिंग समस्या का हल :

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0]; 

कुछ अजीब कारणों के लिए स्वत: पूर्णता भी नहीं आई ith -performSelector:withObject:afterDelay: इसलिए मुझे इसे मैन्युअल रूप से टाइप करना पड़ा। इसके बजाय, यह पेशकश केवल -performSelector: और -performSelector:withObject:withObject:

मेरा अनुमान है कि यह ऑब्जेक्टिव-सी में प्रतिनिधियों के लिए प्रकार के रूप में आईडी का उपयोग करने के लिए सिर्फ बेवकूफ है, और मैं वास्तव में क्यों सहित सभी अपने आप को बस के रूप में यह परिभाषित करने के बजाय कि क्या कर रहा है पता नहीं था NSObject। हालांकि, मेरे प्रोटोकॉल ने यह भी बताया कि जो भी प्रोटोकॉल के अनुरूप है उसे भी ऐसा करके एनएसओब्जेक्ट प्रोटोकॉल के अनुरूप होना चाहिए: OverlayDelegate <NSObject> - और फिर भी, कंपाइलर इसे नहीं मिला।

तो अब के लिए मैं संतुष्ट यह कलाकारों के साथ काम करता है, लेकिन यह पुरानी मछली खाने की तरह लगता है।

+0

नोट: मेरा जवाब टाइप करते समय एक संदेश दिखाई दिया कि एक उत्तर dtuckernet द्वारा पोस्ट किया गया है। तो वह तेज था। – openfrog

+2

ऐसा इसलिए है क्योंकि 'प्रदर्शन चयनकर्ता: ऑब्जेक्ट: बाद में:' एनएसओब्जेक्ट 'प्रोटोकॉल की बजाय कक्षा' एनएसओब्जेक्ट 'पर परिभाषित किया गया है। यही कारण है कि यह (एआरसी के तहत) गलती हुई और कोड पूरा होने में नहीं आया। – mattjgalloway

+0

अब पूरी तरह से समझ में आता है। – openfrog

3

सरल, आपकी वस्तु id प्रकार है और NSObject प्रोटोकॉल के अनुरूप है। हालांकि, यह प्रोटोकॉल performSelector:withObject:afterDelay: घोषित नहीं करता है, इसलिए एआरसी नहीं जानता कि विधि क्या कर रही है और यदि उसे कुछ भी बनाए रखना चाहिए। या तो एक NSObject का उपयोग करें या विधि कॉल करने से पहले इसे कास्ट करें।

0

मैं त्रुटि मिले: फ़ाइल नाम @interface और @implementation साथ वर्ग के नाम के बराबर नहीं है:

No known class method for selector conformsToProtocol:

कारण यह है कि है।

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

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