नहीं बुलाया हो रही Deinit मैं एक UIView एक आप नीचे देख सकते करने के लिए इसी तरह की है:आईओएस अधिसूचना पर्यवेक्षक को हटाने में असमर्थ।
class ViewTaskViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
subscribeToNotifications()
}
func subscribeToNotifications() {
let notification = NotificationCenter.default
notification.addObserver(forName: Notification.Name(rawValue: "TimerUpdated"), object: nil, queue: nil, using: handleUpdateTimer)
print("Subscribed to NotificationCenter in ViewTaskViewController")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("TUFU TUFU TUFU")
NotificationCenter.default.removeObserver(self)
}
deinit {
print("DENINT")
}
@objc func handleUpdateTimer(notification: Notification) {
if let userInfo = notification.userInfo, let timeInSeconds = userInfo["timeInSeconds"] as? Int {
withUnsafePointer(to: &self.view) {
print("We got timeeeeee \(timeInSeconds) \($0)")
}
//do something here....
}
}
}
मुद्दा मैं कर रहा हूँ है कि मैं इस विशेष UIView जब से पर्यवेक्षकों को दूर करने में असमर्थ हूँ उपयोगकर्ता बैक बटन हिट करता है और दूसरे व्यू कंट्रोलर पर लौटता है।
ViewWillDisppear
कहा जाता है लेकिन deinit
नहीं कहा जाता है। अजीब बात यह है कि अगर हम subscribeToNotifications()
को viewDidLoad()
से हटाते हैं तो deinit
कहा जाता है।
अन्य मुद्दा स्मृति रिसाव से संबंधित है। जैसा कि आप नीचे दिए गए स्क्रीनशॉट में देख सकते हैं, जब दृश्य अधिसूचनाओं की सदस्यता लेता है और उपयोगकर्ता दृश्य को फिर से दर्ज/पुनः प्रविष्ट करता है, तो स्मृति उपयोग बढ़ता है।
अब तुलना करें कि subscribeToNotifications()
पर टिप्पणी की गई है, स्मृति उपयोग में कोई वृद्धि नहीं है और दृश्य नियंत्रक का केवल एक उदाहरण है। निष्कर्ष यह है कि UIView के नए उदाहरण की अधिसूचना सदस्यता निर्माण के बीच एक सहसंबंध है, इसलिए deinit
नहीं कहा जा रहा है।
मैं यह जानना चाहता हूं कि कोई तरीका है कि हम दृश्य को पूर्वनिर्धारित कर सकते हैं और अधिसूचना से सदस्यता समाप्त कर सकते हैं।
अगर आपको और जानकारी चाहिए तो कृपया मुझे बताएं। :)
आप जो 'addObserver' विधि का उपयोग कर रहे हैं, उसके लिए दस्तावेज़ीकरण कहता है, "अवलोकनों को अनधिकृत करने के लिए, आप ओब्सर्वर (_ :)।" को हटाने के लिए ** इस विधि द्वारा लौटा ** ऑब्जेक्ट पास करते हैं। इसके बजाए, आप मानते हैं कि 'स्वयं' पंजीकृत वस्तु है। –