2012-07-18 13 views
6

संभव डुप्लिकेट:
How or where should I store object instances that I require globally within my iOS app?जहां स्टोर करने के लिए "वैश्विक" आईओएस में वस्तुओं

मैं कुछ वैश्विक वस्तु (लगभग सभी आवेदन स्क्रीन का उपयोग करता है) है और ज्यादातर वे सही होने के बाद बनाई गई हैं आवेदन शुरू होता है। मैं अपने सभी व्यू कंट्रोलर से कुछ ऑब्जेक्ट तक पहुंच बनाना चाहता हूं (कुछ और नहीं, केवल व्यू कंट्रोलर)। इसे कहां स्टोर करें?

मुझे @propertyAppDelegate में लगता है लेकिन मुझे लगता है (लेकिन मैं गलत हो सकता हूं) यह एक बदसूरत समाधान है।

ऑब्जेक्ट्स काफी जटिल हो सकते हैं, यह एक साधारण प्रकार नहीं है।

+1

संभावित डुप्लिकेट [मैं अपने आईओएस ऐप के भीतर वैश्विक स्तर की आवश्यकता वाले ऑब्जेक्ट इंस्टेंस को कैसे संग्रहीत कर सकता हूं?] (Http://stackoverflow.com/q/5721990/), [आईओएस ऐप में ग्लोबल वैरिएबल] (http: //stackoverflow.com/q/9096712/), [मैं वैश्विक चर कहां बना सकता हूं?] (http://stackoverflow.com/q/9593594/), [मैं आईओएस में वैश्विक चर कैसे सहेज सकता हूं] (http://stackoverflow.com/q/9960982/), [आईफोन देव: वैश्विक चर] (http://stackoverflow.com/q/7368820/), [ओबीजेसी में वैश्विक चर] (http://stackoverflow.com/q/ 1643467 /), [वैश्विक चर रखने के लिए सबसे अच्छा तरीका] (http://stackoverflow.com/q/3456981/) –

उत्तर

10

आप इन वस्तुओं को तैयार करने के लिए +(void)load लागू करने और स्थिर चर में संग्रहीत करने के लिए वैश्विक वस्तुओं तक पहुंचने के लिए कक्षा विधियों के साथ कक्षा में रखकर वैश्विक वस्तुओं को सुलभ बना सकते हैं।

हैडर:

@interface GlobalObjects 
+(void)load; 
+(MyObject1*)myObject1; 
@end 

कार्यान्वयन:

#import "GlobalObjects.h" 
static MyObject1* _myObject1 = nil; 
@implementation GlobalObjects 
+(void)load { 
    _myObject1 = [[MyObject1 alloc] init]; 
} 
+(MyObject1*)myObject1 { 
    return myObject1; 
} 
@end 

उपयोग:

MyObject1 *shared = [GlobalObjects myObject1]; 

तुम भी आलसी आरंभीकरण के लिए अपने विधि के अंदर चर स्थिर बना सकता है।

+0

मुझे कुछ हिस्सा समझ में नहीं आता है। अगर मेरे पास ग्लोबल ऑब्जेक्ट्स क्लास है तो मुझे इसे अपने सभी वर्गों में लागू करना होगा? यदि मैं इसे क्लास विधि के रूप में सेट करता हूं तो कक्षाओं में उदाहरण बनाने की आवश्यकता नहीं है? – Kuba

+0

@ सिंपलमेन आपको केवल 'GlobalObjects.h' आयात करने की आवश्यकता है। चूंकि इसकी सभी विधियां * कक्षा विधियां हैं * ('+' पर ध्यान दें) आपको 'ग्लोबलऑब्जेक्ट्स' को तुरंत चालू करने की आवश्यकता नहीं है। वर्ग को कोको रनटाइम में लोड होने पर '+ (शून्य) लोड' विधि स्वचालित रूप से कॉल की जाती है, इसलिए आपको इसे कॉल करने की आवश्यकता नहीं है। – dasblinkenlight

+0

धन्यवाद, यह उपयोगी है – Kuba

3

हाँ मैं ऐप प्रतिनिधि के गुणों का उपयोग करता हूं, फिर साझा अनुप्रयोग प्रतिनिधि संपत्ति कास्टिंग करके उन्हें एक्सेस करता हूं।

__weak AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

आशा इस मदद करता है,

जोनाथन AppDelegate में

1

@property एक अच्छा समाधान है। आप एक सिंगलटन का भी उपयोग कर सकते हैं।

+0

http://www.hollance.com/2012/02/dont-abuse-the-app-delegate/ – fabb

+0

http://stackoverflow.com/questions/569940/whats-the-best-way-to-communicate-between-view-controllers – fabb

1

यदि आपके पास ऑब्जेक्ट्स का समूह है तो आप ऐप प्रतिनिधि ठीक है।

अन्यथा आप अपने सभी वैश्विक डेटा वाले "मॉडल ऑब्जेक्ट" का एक प्रकार बना सकते हैं।

या, यदि आप किसी भी संरचना में हैं, तो आप उन्हें कोर डेटा के साथ स्टोर कर सकते हैं।

लेकिन, जैसा कि मैंने कहा, यदि आपके पास केवल कुछ ऑब्जेक्ट हैं, तो ऐप प्रतिनिधि बस ठीक काम करेगा।

+0

"यदि उनके पास कोई संरचना है" तो आपका क्या मतलब है। मेरे मामले में यह एनएसएआरएआरई में मेरी अपनी वस्तुएं होंगी (एक साधारण प्रकार नहीं)। – Kuba

+0

मेरा मतलब है, कोर डेटा एक डेटा बेस है, इसलिए मूल रूप से, यदि उनके पास ऐसी संरचना है जो डेटा बेस बनाने का सुझाव देगी। यह केवल विकल्पों का पूरा सेट दिखाने के लिए था, ताकि आप बेहतर तरीके से निर्णय ले सकें कि आपके लिए कौन सा विकल्प बेहतर है। सवाल यह है कि आप डेटा तक कैसे पहुंचेंगे? एक एनएसएआरएआरई सही है और आपको अपनी अनुक्रमणिका द्वारा वस्तुओं तक पहुंचने की अनुमति देगा; आप एक NSDictionary का उपयोग कर सकते हैं और फिर प्रत्येक ऑब्जेक्ट को अपने "नाम" (शब्दकोश कुंजी) द्वारा एक्सेस कर सकते हैं ... अधिक सहायता के लिए, संभवतः आपको अपनी ऑब्जेक्ट्स के बारे में अधिक जानकारी देनी चाहिए ... – sergio

1

यदि यह केवल दृश्य नियंत्रकों के बीच उपयोग किया जाता है, तो आप इसे उच्चतम स्तर दृश्य नियंत्रक में संग्रहीत करने पर विचार कर सकते हैं, जिसे वास्तव में साझा ऑब्जेक्ट तक पहुंच की आवश्यकता होती है (जब नए नियंत्रकों को बनाते/दबाते हैं, उस संदर्भ की गणना की गई संपत्ति सेट करें)।

इस तरह से, आप मास्टर व्यू कंट्रोलर के बारे में सोच सकते हैं जो विस्तार सामग्री नियंत्रकों को उनकी सामग्री/मॉडल के साथ पॉप्युलेट कर रहा है।

जो कि वास्तव में योग्यता (और बोझ) के रूप में योग्यता से दूर हो रहा है।

+0

यह अच्छी सलाह है, लेकिन प्रत्येक दृश्य नियंत्रक के लिए इसका पालन करने के बाद मुझे वस्तुओं का एक और उदाहरण बनाना होगा। क्या मैं सही हू? मैं इस ऑब्जेक्ट को एक बार सेट करना चाहता हूं और किसी भी ViewController से उन तक पहुंच प्राप्त करना चाहता हूं। – Kuba

+0

@ सिंपलमेन आप वीसी (देखें नियंत्रक) के बीच संदर्भ ('NSArray' पर) साझा करेंगे। सरणी के तत्वों की प्रतिलिपि नहीं बनाई जाएगी। आपको इस सरणी के लिए अपने वीसी में नई संपत्तियां घोषित करने की आवश्यकता होगी, लेकिन अधिकांश दिनों में वैश्विक 'एनएसएआरएआरई' की तुलना में यह कम बुराई है। इसे वीसी और उनके विचारों के बीच एक दस्तावेज़ या मॉडल साझा करने की कल्पना करें। इसलिए, नहीं, आपको कोई अतिरिक्त ऑब्जेक्ट (कोई नई सरणी या उसके तत्व) बनाने की आवश्यकता नहीं है - लेकिन आपको इस साझा ऑब्जेक्ट के लिए अपने वीसी में गुण (स्टोरेज) घोषित करना होगा, और आपको उस प्रॉपर्टी को सेट करना होगा जब वीसी का निर्माण/धक्का होता है। – justin

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