2011-03-17 13 views
20

मेरा प्रश्न उस वस्तु के संबंध में है जो -postNotificationName:object: userInfo: विधि में जोड़ा जाता है।क्या NSNotification ऑब्जेक्ट को बनाए रखता है?

क्या NSNotification ऑब्जेक्ट को बनाए रखता है? (NSMutableDictionary या सरणी के लिए इसी तरह से) ... जिसका अर्थ है मैं अधिसूचना

नीचे पोस्टिंग के बाद वस्तु जारी कर सकते हैं मदद करने के लिए मेरे सवाल का वर्णन एक कोड का टुकड़ा है ... यह वस्तु जारी करने के लिए मान्य है। ऐप्पल दस्तावेज का एक लिंक वास्तव में सहायक हो सकता है।

NSMutableDictionary *teamDictCopy = [self.teamDict mutableCopy]; 
[teamDictCopy setObject:[NSNumber numberWithInt:self.scrollViewIndex] forKey:@"imageIndex"]; 

if([self.statusButton.title isEqualToString:@"Completed"]){ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"UnComplete" object:teamDictCopy userInfo:nil]; 
} 

[teamDictCopy release]; 

उत्तर

31

"NSNotification वस्तु (इसी तरह से NSMutableDictionary या सरणी के लिए) ... अर्थ मैं अधिसूचना पोस्टिंग के बाद वस्तु जारी कर सकते हैं बनाए रखने करता है?"

मुझे यकीन नहीं है कि object और userInfo पैरामीटर उस विधि द्वारा बनाए गए हैं या नहीं, लेकिन व्यावहारिक रूप से, यह वास्तव में कोई फर्क नहीं पड़ता।

मुझे लगता है कि आप कल्पना कर सकते हैं कि NSNotificationCenter इन सूचनाओं को बना रहा है और उन्हें एक असीमित तरीके से प्रसारित कर रहा है, लेकिन ऐसा नहीं है। के रूप में (NSNotificationCenter Class Reference देखें) NSNotificationCenter के लिए दस्तावेज में कहा गया है, सूचनाएं तुल्यकालिक पोस्ट कर रहे हैं:

एक सूचना केन्द्र पर्यवेक्षकों तुल्यकालिक को सूचनाएं देता है। दूसरे शब्दों में, postNotification: विधियां वापस नहीं आती हैं जब तक सभी पर्यवेक्षकों के पास अधिसूचना प्राप्त और संसाधित नहीं होती है। अधिसूचनाएं भेजने के लिए असीमित रूप से NSNotificationQueue का उपयोग करें। एक बहु आवेदन में, सूचनाएं हमेशा में धागा, जिसमें अधिसूचना पोस्ट किया गया था, जो एक ही धागा, जिसमें एक पर्यवेक्षक पंजीकृत ही नहीं हो सकता है दिया जाता है।

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

दूसरे शब्दों में, जब तक आपका कोड [teamDictCopy release] लाइन पर जाता है, teamDictCopy सभी इच्छुक पार्टियों द्वारा पहले ही "उपयोग" किया जा चुका है। इसलिए, इसे जारी करने में कोई खतरा नहीं होना चाहिए।

सम्मेलनों पर बस एक नोट। आम तौर पर, object: पैरामीटर उस ऑब्जेक्ट के लिए होता है जो अधिसूचना पोस्ट कर रहा है, और userInfo: पैरामीटर अतिरिक्त जानकारी के NSDictionary के लिए है। इसलिए, सामान्य रूप से, आप अधिसूचना को निम्न प्रकार से संभाल लेंगे:

NSMutableDictionary *teamDictCopy = [self.teamDict mutableCopy]; 
[teamDictCopy setObject: 
    [NSNumber numberWithInt:self.scrollViewIndex] forKey:@"imageIndex"]; 

if([self.statusButton.title isEqualToString:@"Completed"]){ 
[[NSNotificationCenter defaultCenter] postNotificationName:@"UnComplete" 
    object:self userInfo:teamDictCopy]; 
    } 

[teamDictCopy release]; 
+1

धन्यवाद ... आपका उत्तर मेरे प्रश्न से अधिक स्पष्ट हो गया। _always learning_ – MDMonty

+5

यह सच होगा यदि NSNotifications का उपयोग केवल NSNotificationCenters के साथ किया जाता था। NSNotificationQueue के बारे में क्या? उस स्थिति में हम असीमित रूप से पोस्ट कर रहे हैं और इससे कोई फर्क नहीं पड़ता कि वस्तु बरकरार है या नहीं। – DougW

5

हाँ - आप ऑब्जेक्ट को ऑब्जेक्ट के ऑब्जेक्ट के रूप में सेट करने के बाद ऑब्जेक्ट को छोड़ सकते हैं।

आप उपclass भी कर सकते हैं।

एक विशिष्ट दस्तावेज़/कथन तक: मुझे विशेष रूप से याद नहीं है।

हालांकि यह वस्तुओं का आधार है, उनके आवृत्ति चर, और वितरित संचार और सिग्नलिंग जब किसी ऑब्जेक्ट के रूप में पहचाने जाते हैं।

मैंने आपके लिए एक परीक्षा लिखी है, इसलिए आपको इसका आश्वासन दिया जा सकता है। ऑब्जेक्ट को बनाए रखा नहीं गया था, तो अधिसूचनाओं के उपयोग के मामले कम होंगे। बस एक ब्रेकपॉइंट जोड़ें जहां निर्देश दिया गया है, फिर ब्रेकपॉइंट सक्षम के साथ चलाएं। का आनंद लें!

#import <Foundation/Foundation.h> 

@interface MONObject : NSObject 
@end 

@implementation MONObject 

- (id)retain { 
    return self; /* << add breakpoint here */ 
} 

/* needed to counter retain override 
    (although all MONObjects will leak in this example) 
*/ 
- (void)release { 
} 

@end 

int main(int argc, const char* argv[]) { 
    NSAutoreleasePool * pool = [NSAutoreleasePool new]; 

    NSString * name = @"UnComplete"; 
    MONObject * obj = [MONObject new]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:name object:obj userInfo:nil]; 
    [obj release], obj = 0; 

    [pool drain]; 
    return 0; 
} 
+0

हाय जस्टिन ... आपके उत्तर का समर्थन करने के लिए ऐप्पल डॉक्स को स्रोत करने में सक्षम हैं। मैं कुछ घंटों के लिए शिकार पर रहा हूं, शायद मैं इसे याद कर चुका हूं। – MDMonty

+0

@MDMonty मैंने जवाब का विस्तार किया है। आप '-MONObject रिलीज] पर ब्रेकपॉइंट जोड़ सकते हैं, यदि आप बिंदु निष्पादन को देखना चाहते हैं जहां इसे जारी किया गया है। आशा है कि पुष्टि के रूप में कार्य करता है। यदि यह 'शून्य * था, तो निश्चित रूप से इसे बनाए रखने की अपेक्षा न करें, लेकिन ऑब्जेक्ट एक आईडी है। – justin

+0

आपको बहुत बहुत धन्यवाद। एक बहुत अच्छा प्रदर्शन। काश मैं 2 'सही उत्तर' का पुरस्कार दे सकता हूं क्योंकि आपकी प्रतिक्रिया ने दूसरे की प्रशंसा में मदद की। – MDMonty

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