मैं NSNotification
स्विफ्ट के लिए पर्यवेक्षक को कहां से हटाऊं, कब से उपलब्ध हैं viewDidUnload
और dealloc()
अनुपलब्ध हैं?
मैं NSNotification
स्विफ्ट के लिए पर्यवेक्षक को कहां से हटाऊं, कब से उपलब्ध हैं viewDidUnload
और dealloc()
अनुपलब्ध हैं?
जवाबों:
नीचे दिए गए विधि का उपयोग करें जो समान रूप से कार्य करता है dealloc
।
deinit {
// Release all resources
// perform the deinitialization
}
क्लास इंक्लॉस्केट होने से ठीक पहले एक डीइन्यूएस्टाइज़र कहा जाता है। आप डीइनिटाइज़र को डिनिट कीवर्ड के साथ लिखते हैं, उसी तरह जैसे कि इंट्राइज़र को इनिट कीवर्ड के साथ लिखा जाता है। Deinitializers केवल वर्ग प्रकारों पर उपलब्ध हैं।
deinit
जब ViewControllerB धक्का होगा, तो ViewControllerA के लिए @ कामाई विधि नहीं कहा जाएगा।
deinit
ViewControllerA के लिए केवल तभी कहा जाएगा जब यह नेविगेशन कंट्रोलर के स्टैक में न हो। उदाहरण के लिए: rootViewController पर स्विच करना (यदि rootViewController ViewControllerA नहीं है)
deinit
। कॉल करने के लिए आदर्श स्थानfunc viewDidDisappear(_ animated: Bool)
के रूप में आईओएस 9 (और ओएस एक्स 10.11), आप पर्यवेक्षकों को दूर करने की जरूरत नहीं है अगर आप ब्लॉक आधारित पर्यवेक्षकों हालांकि उपयोग नहीं कर रहे अपने आप को,। सिस्टम इसे आपके लिए करेगा, क्योंकि यह पर्यवेक्षकों के लिए शून्यिंग-कमजोर संदर्भों का उपयोग करता है, जहां यह हो सकता है।
और यदि आप ब्लॉक आधारित पर्यवेक्षकों का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप क्लोजर की कैप्चर सूची का उपयोग करके स्वयं को कमजोर रूप से कैप्चर करते हैं [weak self]
, और पर्यवेक्षक को deinit
विधि में हटा दें । यदि आप स्वयं के लिए कमजोर संदर्भ का उपयोग नहीं करते हैं, तो deinit
विधि (और इस प्रकार उस पर्यवेक्षक को हटाने) को कभी भी कॉल नहीं किया जाएगा क्योंकि अधिसूचना केंद्र अनिश्चित काल तक इसका एक मजबूत संदर्भ रखेगा।
अधिक जानकारी OS X v10.11 और iOS 9 के लिए फाउंडेशन रिलीज नोट्स पर मिल सकती है ।
यदि पर्यवेक्षक को शून्य-कमजोर संदर्भ के रूप में संग्रहीत किया जा सकता है, तो अंतर्निहित भंडारण पर्यवेक्षक को एक शून्य कमजोर संदर्भ के रूप में संग्रहीत करेगा, यदि वैकल्पिक रूप से ऑब्जेक्ट को कमजोर रूप से संग्रहीत नहीं किया जा सकता है (अर्थात इसमें कस्टम अनुरक्षण / रिलीज तंत्र है जो रनटाइम को रोक देगा; ऑब्जेक्ट को कमजोर रूप से संग्रहीत करने में सक्षम होने से) यह ऑब्जेक्ट को गैर-कमजोर शून्यिंग संदर्भ के रूप में संग्रहीत करेगा। इसका मतलब यह है कि पर्यवेक्षकों को अपने निपटान पद्धति में संयुक्त राष्ट्र के पंजीकरण की आवश्यकता नहीं है।
- [NSNotificationCenter addObserverForName: ऑब्जेक्ट: कतार: usingBlock] विधि के माध्यम से ब्लॉक स्थित पर्यवेक्षकों को अभी भी संयुक्त राष्ट्र के पंजीकृत होने की आवश्यकता है जब सिस्टम अब भी इन पर्यवेक्षकों के लिए एक मजबूत संदर्भ नहीं रखता है।
delegate = nil
में लिखता था dealloc()
। क्या यह अब से वही काम करता है?
आप तीन तरीकों का उपयोग कर सकते हैं:
के बाद popViewController
, वापस navigationController
या dismissViewControllerAnimated
:
deinit {
print("Remove NotificationCenter Deinit")
NSNotificationCenter.defaultCenter().removeObserver(self)
}
viewDidDisappear
, इसे हटाने के बाद यह पहले से ही अगले नियंत्रक है:
override func viewDidDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
viewWillDisappear
- अगला दृश्य खोलने से पहले:
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
स्विफ्ट 3.0 सिंटैक्स:
NotificationCenter.default.removeObserver(self)
स्विफ्ट 4.2 में, यह एक तरीका है जिससे आप पर्यवेक्षक को हटा सकते हैं
deinit {
NotificationCenter.default.removeObserver(self, name: Notification.Name.Identifier, object: nil)
}
viewDidLoad वर्ग में सेटअप addObserver अधिसूचना
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(didReceivedItemDetail), name: Notification.Name.Identifier, object: nil)
}
स्विफ्ट एक विध्वंस विधि प्रदान करता है जिसे नष्ट होने से पहले कक्षाओं के उदाहरणों पर कहा जाता है।
मैं यह भी बताना चाहता हूं कि आपको इस विधि का उपयोग करना चाहिए:
func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
के बजाय
func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol
उत्तरार्द्ध पर्यवेक्षक को नहीं हटाएगा (हाल ही में इस समस्या में भाग गया)। यदि आप iOS9 का उपयोग कर रहे हैं तो पूर्व पर्यवेक्षक को हटा देगा।
dealloc
विधि में नहीं निकाला है ।
deinit {
NotificationCenter.default.removeObserver(self)
}
स्विफ्ट 5
मेरे पास एक चैट एप्लिकेशन है, इसलिए जब भी मैं अपने ChatLogViewController से कुछ अन्य व्यू कॉन्ट्रोलर और फिर वापसी पर जाता हूं, तो मेरे पास मेरी कीबोर्ड सूचना का 1 अतिरिक्त ऑब्जर्वर है। इसे हटाने के लिए जब मैं अपना व्यू-कॉन्ट्रोलर बदलता हूं या अपने चैटलॉग व्यू कॉन्ट्रोलर से गायब हो जाता हूं, तो सभी पर्यवेक्षकों को हटा देता हूं ।
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self)
}