34

ऐपडिलेगेट में, मैं एक स्थिर पुस्तकालय में परिभाषित एक उदाहरण आवंटित कर रहा हूं। इस उदाहरण में एक एनएसएसटींग संपत्ति एक "प्रतिलिपि" सेट है। जब मैं इस उदाहरण पर स्ट्रिंग प्रॉपर्टी तक पहुंचता हूं, तो ऐप 'अज्ञात चयनकर्ता को उदाहरण के लिए भेजा जाता है' के साथ दुर्घटनाग्रस्त हो जाता है। एक्सकोड संपत्ति के लिए एक कोड संकेत प्रदान करता है, जिसका अर्थ है कि यह कॉलिंग ऐप में जाना जाता है। विशिष्ट वर्ग स्थिर पुस्तकालय लक्ष्य में संकलित किया गया है। मैं क्या खो रहा हूँ?'अपरिचित चयनकर्ता को उदाहरण के लिए भेजा गया' को कैसे हल करें?

कुछ कोड जोड़ना।

//static library 
//ClassA.h 
@interface ClassA : NSObject { 
... 
NSString *downloadUrl; 
} 
@property(nonatomic, copy) NSString *downloadUrl; 

//ClassA.m 
@synthesize downloadUrl; 

कॉलिंग ऐप के ऐप डिलीगेट में।

//app delegate header file 
@interface myApp : NSObject <UIApplicationDelegate> { 
ClassA *classA; 
} 
@property (nonatomic, retain) ClassA *classA; 

//app delegate .m file 
@synthesize classA; 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
classA = [[ClassA alloc] init]; 
//exception occurs here. downloadUrl is of type NSCFNumber 
classA.downloadUrl = @"http://www.abc.com/"; 
...} 

अनुप्रयोग में अन्य वर्गों प्रतिनिधि के लिए एक संदर्भ हो और classA.downloadUrl कॉल करेंगे।

+2

मुझे लगता है कि आप कोड के टुकड़े और पूर्ण त्रुटि संदेश पोस्ट करने के लिए यहाँ बहुत मदद पाने के लिए की आवश्यकता होगी। – smorgan

उत्तर

25

1) @implementation ब्लॉक के भीतर संश्लेषण है?

2) क्या आपको सादे classA के बजाय self.classA = [[ClassA alloc] init]; और self.classA.downloadUrl = @"..." का संदर्भ लेना चाहिए?

3) आपकी myApp.m फ़ाइल में आपको ClassA.h आयात करने की आवश्यकता है, जब यह गायब हो जाए तो यह किसी संख्या या सूचक के लिए डिफ़ॉल्ट होगा? (सी चर वैरिएबल में int को डिफ़ॉल्ट रूप से अगर संकलक द्वारा नहीं मिला है):

#import "ClassA.h"

+1

पहले से ही कोशिश कर चुके हैं। अभी भी अपवाद प्राप्त करें। मेरे पास एक ही पुस्तकालय में कई अन्य समान वर्ग हैं। उनमें से कोई भी इस मुद्दे को नहीं कर रहा है। – 4thSpace

+0

क्या आपने कोशिश की है [classA setDownloadUrl: @ "http://www.abc.com/"]; ....? – stefanB

+0

... बेशक 'www' को पिछली टिप्पणी में वेब लिंक से छोटा कर दिया गया था – stefanB

1

कोड आप पोस्ट में, आप ClassA को setDownloadURL: सेटर भेज रहे हैं - जो है, वर्ग ही। आप एक उदाहरण की संपत्ति सेट करना चाहते हैं।

+0

स्थिर वर्ग में मेरे पास @property (nonatomic, copy) NSString * theString और theString @synthesize है। क्या कुछ और है? – 4thSpace

+0

मैं नोट करता हूं जब मैं कॉलर पक्ष पर स्ट्रिंग पर माउस करता हूं, इसका प्रकार एनएससीएफएनंबर है। एनएसएसटींग होना चाहिए। – 4thSpace

+0

आप इसे कैसे एक्सेस करते हैं? – stefanB

1

आप अपनी एपडिलेगेट क्लास में क्लास को कैसे आयात कर रहे हैं? क्या आपने मुख्य परियोजना में .h फ़ाइल शामिल की थी? मुझे थोड़ी देर के लिए यह समस्या थी क्योंकि मैंने हेडर फ़ाइल को मुख्य प्रोजेक्ट के साथ-साथ सामान्य # शामिल "कक्षा एएच" में कॉपी नहीं किया था।

कॉपी करना, या बनाना .h ने इसे मेरे लिए हल किया।

+0

लाइब्रेरी में, मेरे पास एक .h है जो अन्य सभी .h फ़ाइलों का संदर्भ देता है। इसलिए, कॉलिंग ऐप को लाइब्रेरी में सबकुछ का संदर्भ प्राप्त करने के लिए केवल उस विशेष .h फ़ाइल को संदर्भित करने की आवश्यकता है। मैं क्लास एडर फ़ाइल को ऐप प्रोजेक्ट में खींच सकता हूं और इसे .m फ़ाइल से संदर्भित कर सकता हूं। फिर भी वही अपवाद प्राप्त करें। – 4thSpace

+0

एक और चीज जिसे आप कोशिश करना चाहते हैं वह self.classA.downloadUrl कर रहा है। यह त्रुटि आमतौर पर आपको प्राप्त होती है जब एक चर को कुछ भी नहीं शुरू किया जाता है, जैसे NSString * m। यह कुछ प्रतीत होता है यादृच्छिक int। आप कक्षा में init विधि को ओवरराइड करने और इसे वहां शून्य करने के लिए सेट करने का प्रयास कर सकते हैं। –

+0

मैंने इनिट को ओवरराइड करने का प्रयास किया है लेकिन वहां मेरा ब्रेकपॉइंट कभी हिट नहीं हुआ है। हालांकि, अगर मैं क्लास पर परिभाषा पर कूदता हूं जहां आवंटन है, तो यह सही फ़ाइल पर जाता है और मैं अपना कस्टम इनिट देखता हूं। – 4thSpace

0

आपको ध्यान रखना चाहिए कि यह आवश्यक रूप से सबसे अच्छा डिजाइन पैटर्न नहीं है। इसकी प्रकृति से, आप अनिवार्य रूप से वैश्विक ऐप की मात्रा को स्टोर करने के लिए अपने ऐप प्रतिनिधि का उपयोग कर रहे हैं।

मैट गैलाघर ने http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html पर अपने लेख कोको के साथ कोको में अच्छी तरह से ग्लोबल्स के मुद्दे को शामिल किया। सभी संभावनाओं में, आपका क्लास एपडिलेगेट में वैश्विक की बजाय एक सिंगलटन होना चाहिए, हालांकि संभव है कि आप क्लासए को अधिक सामान्य उद्देश्य और केवल एक सिंगलटन न करें। उस मामले में, आप शायद या तो एक वर्ग विधि के साथ बेहतर होगा क्लास ए के एक पूर्व कॉन्फ़िगर उदाहरण वापस जाने के लिए, कुछ की तरह:

+ (ClassA*) applicationClassA 
{ 
    static ClassA* appClassA = nil; 
    if (!appClassA) { 
     appClassA = [[ClassA alloc] init]; 
     appClassA.downloadURL = @"http://www.abc.com/"; 
    } 
    return appClassA; 
} 

या वैकल्पिक रूप से (कि आवेदन विशिष्ट सामान जोड़ना होगा के बाद से क्या है करने के लिए संभवतः एक सामान्य उद्देश्य वर्ग), एक नई कक्षा बनाएं जिसका एकमात्र उद्देश्य उस वर्ग विधि को शामिल करना है।

बिंदु यह है कि एप्लिकेशन ग्लोबल्स को ऐपडिलेगेट का हिस्सा होने की आवश्यकता नहीं है। सिर्फ इसलिए कि ऐपडिलेगेट एक ज्ञात सिंगलटन है, इसका मतलब यह नहीं है कि हर दूसरे ऐप ग्लोबल को इसके साथ मिश्रित किया जाना चाहिए, भले ही उनके पास एनएसएप्लिकेशन प्रतिनिधि विधियों को संभालने के लिए कुछ भी नहीं है।

+1

हाथ में जारी करने के लिए अप्रासंगिक। – Justicle

18

सेट करें ध्वज -ObjC अन्य लिंकर में अपनी परियोजना सेटिंग में ध्वजांकित करें ...(स्थिर लाइब्रेरी प्रोजेक्ट में नहीं, बल्कि यह प्रोजेक्ट जो स्थिर लाइब्रेरी का उपयोग कर रहा है ...) और सुनिश्चित करें कि प्रोजेक्ट सेटिंग कॉन्फ़िगरेशन पर सेट है सभी कॉन्फ़िगरेशन

+0

मैंने अभी Xcode4.2 में एक अनजान लक्ष्य के साथ एक स्थिर लाइब्रेरी बनाई है। मुझे "अन्य लिंकर ध्वज" में "-ओबीजेसी" जोड़ना पड़ा। अब unittest रन। – neoneye

+0

वह मेरे लिए समाधान था !!! धन्यवाद। – Xtro

0

बहुत अजीब, लेकिन। आपको अपने आवेदन उदाहरण के लिए कक्षा को मेरे आवेदन के रूप में घोषित करना होगा: मेरे आवेदन के बजाय यूआईपीप्लिकेशन: एनएसओब्जेक्ट। ऐसा लगता है कि UIAplplicationDelegate प्रोटोकॉल + रजिस्टरForSystemEvents संदेश को लागू नहीं करता है। पागल ऐप्पल एपीआई, फिर से।

14

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

डबल-चेक करने का सबसे आसान तरीका यह है कि आइटम को नियंत्रित करने के लिए यह मामला नहीं है ताकि आप इसके साथ जुड़े सभी चयनकर्ताओं को देख सकें। अगर वहां कुछ भी है जो आप नहीं बनना चाहते हैं, तो इससे छुटकारा पाएं! उम्मीद है कि यह मदद करता है ...

+0

एक लंबे दिन के अंत में, यह वही था जो मुझे देखने की ज़रूरत थी। इसे सरल रखने के लिए धन्यवाद। – jeremytripp

+0

बस यह मेरी पहली आईओएस परियोजना में था। मेरे दृश्य नियंत्रक में एक क्रिया कार्यान्वयन के लिए मेरे पास एक मृत "लिंक" था। इसे हटा दिया, और यह काम किया। धन्यवाद! –

+0

बिंगो - बिल्कुल मुझे क्या चाहिए! धन्यवाद! – Kenny

1

मेरे लिए, यह त्रुटि किस वजह से हुई कि मुझे गलती से उसी संदेश के सदस्य को दो बार भेजा जा रहा था। जब मैंने गुई में बटन पर दायाँ क्लिक किया, तो मैं विधि नाम दो बार देख सकता था, और मैंने अभी एक हटा दिया। निश्चित रूप से मेरे मामले में नौसिखिया गलती, लेकिन विचार करने के लिए अन्य नए लोगों के लिए इसे बाहर निकालना चाहता था।

1

मेरा कुछ सरल/बेवकूफ था। न्यूबी गलती, किसी भी व्यक्ति के लिए जिसने अपने एनएसएमएनेज ऑब्जेक्ट को सामान्य एनएसओब्जेक्ट में परिवर्तित कर दिया है।

मैं था:

@dynamic order_id; 

है जब मैं था चाहिए:

@synthesize order_id; 
संबंधित मुद्दे

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