2012-02-15 13 views
6

मैं अपने आईफोन ऐप के लिए कक्षा में काम कर रहा हूं, और मैं इसे पंजीकरण करना चाहता हूं और आवेदन राज्य परिवर्तनों से अवगत रहना चाहता हूं (UIApplicationDidEnterBackgroundNotification, आदि)। स्मृति में तत्काल वस्तु को रखने के बिना अधिसूचनाओं के लिए कक्षा पंजीकृत करने का कोई तरीका है? मैं सिर्फ उचित अधिसूचनाएं कक्षा को कॉल करने के लिए कॉल करना चाहता हूं, कुछ सामान करता हूं, और फिर स्मृति को फिर से छोड़ देता हूं।क्या मैं NSNotifications के लिए कक्षा पंजीकृत कर सकता हूं? क्या मैं NSNotifications के साथ क्लास विधियों का उपयोग कर सकता हूं?

अभी मैं init विधि में निम्नलिखित है:

[[NSNotificationCenter defaultCenter] addObserver: self 
             selector: @selector(handleEnteredBackground) 
              name: UIApplicationDidEnterBackgroundNotification 
              object: nil]; 

और इस विधि वर्ग के मीटर फ़ाइल में कहीं:

- (void) handleEnteredBackground { 
    NSLog(@"Entered Background"); } 

मैं applicationDidLoad के तहत एक बार वर्ग का दृष्टांत, लेकिन चूंकि मैं इसके साथ कुछ नहीं करता हूं, मुझे लगता है कि एआरसी ऑब्जेक्ट को स्मृति से मारता है और ऐप क्रैश हो जाता है (बिना किसी उपयोगी त्रुटि कोड के, आपको दिमाग) जब मैं इसे बंद करने के लिए जाता हूं। यदि मैं handleEnteredBackground को "+" चिह्न के साथ क्लास विधि में स्विच करता हूं, तो जब मैं ऐप बंद करता हूं तो मुझे अमान्य चयनकर्ता त्रुटियां मिलती हैं।

अंतिम लक्ष्य एक ऐप के जीवन चक्र में एक बार कक्षा को तुरंत चालू करना है और यह कक्षा के बाहर किसी भी अतिरिक्त कोड के बिना ऐप राज्य परिवर्तनों का जवाब देने में सक्षम है। आईओएस 5 + एक्सकोड 4.2 +

उत्तर

3

आपको singletons पर देखना चाहिए।

आप आसानी से एक ऑब्जेक्ट बना सकते हैं जो पूरे एप्लिकेशन लाइफसाइकिल के माध्यम से रहता है।

+ (id)sharedObserver 
{ 
    static dispatch_once_t once; 
    static YourObserverClass *sharedObserver = nil; 

    dispatch_once(&once, ^{ 
     sharedObserver = [[self alloc] init]; 
    }); 

    return sharedObserver; 
} 
- (void)startObserving 
{ 
    // Add as observer here 
} 

अब आप [[YourObserverClass sharedObserver] startObserving] कॉल कर सकते हैं और आप इसे बनाए रखना आदि के बारे में चिंता करने की ज़रूरत नहीं

+0

यह एक बढ़िया समाधान की तरह लगता है ... मैं इसे एक शॉट देने के लिए और जवाब को स्वीकार किए जाने के बाद की कोशिश करने का मौका मिला है जाएगा बाहर! – Amos

+0

कोई समस्या नहीं है। यदि आपके पास और प्रश्न हैं तो बस यहां लिखें। – hwaxxer

17

निम्नलिखित काम करना चाहिए:

[[NSNotificationCenter defaultCenter] addObserver: [self class] 
             selector: @selector(handleEnteredBackground:) 
              name: UIApplicationDidEnterBackgroundNotification 
              object: nil]; 

चयनकर्ता ही:

+ (void) handleEnteredBackground: (NSNotification *) notification 
{ 
} 

आपको पर्यवेक्षक को पंजीकरण रद्द करने की आवश्यकता नहीं है, क्योंकि कक्षा वस्तु सौदा नहीं कर सकती स्थित या अन्यथा नष्ट कर दिया। आप अन्य कारणों से पर्यवेक्षक अपंजीकृत करने की जरूरत है, आप कर सकते हैं:

[[NSNotificationCenter defaultCenter] removeObserver: [self class]]; 
+0

कॉस्टिक: एक्सकोड मुझे कक्षा के भीतर से पर्यवेक्षक के रूप में पंजीकृत करने के लिए [स्वयं वर्ग] का उपयोग नहीं करने देगा - यह मुझे "प्राप्त प्रकार" 'बताता है उदाहरण के लिए संदेश चयनकर्ता' ' – Amos

+1

@Amos हां के साथ एक विधियों की घोषणा नहीं करता है , यदि आप कक्षा विधि में 'NSNotificationCenter' के साथ पंजीकरण करते हैं, तो '[स्वयं वर्ग]' के बजाय 'self'' का उपयोग करें। कारण यह है कि 'स्वयं' उदाहरण के तरीकों के अंदर कक्षा के उदाहरण और वर्ग ऑब्जेक्ट को संदर्भित करता है क्लास विधियों के अंदर। – Costique

+0

@ एमोस: क्या? आपको यह चेतावनी किस कॉल से मिल रही है? – user102008

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

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