swift deinit 不被執行

前言:

strong:當你聲明一個屬性時,它默認就是強引用

weak:弱引用對象的引用計數不會+1, 必須爲可選類型變量

在聲明弱引用對象是必須用var關鍵字, 不能用let.
因爲弱引用變量在沒有被強引用的條件下會變爲nil, 而let常量在運行的時候不能被改變.

 

  deinit {
        //移除監聽
        NotificationCenter.default.removeObserver(self)
    }

這個種情況

1.當前頁面是否存在delegate 
 

 var delegate:ZQStarReteViewDelegate?//這種是錯誤的寫法

 weak open var delegate:ZQStarReteViewDelegate?

2.方法體中是否用到了self 

 在swift中 有特殊的寫法  [weak self]
        loadData { [weak self] (dataString) -> () in

            //以後在閉包中中 使用self 都是若引用的
            print("\(dataString) \(self?.view)")
        }
或者
  weak var weakSelf = self
        loadData { (dataString) -> () in
            print("\(dataString) \(weakSelf?.view)")
        }

這種問題又多出現在RX 的監聽事件中

 //監聽鍵盤彈出通知
        _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillShow)
            .takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
            .subscribe(onNext: { _ in
                print("鍵盤出現了")
            })
         
        //監聽鍵盤隱藏通知
        _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillHide)
            .takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
            .subscribe(onNext: { _ in
                print("鍵盤消失了")  
            })
//這裏要注意這就是一個坑,這裏面就寫一個打印事件,事件定是會被移除。但是這種一旦寫入 如
 //監聽鍵盤隱藏通知
        _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillHide)
            .takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
            .subscribe(onNext: { _ in
                print("鍵盤消失了")  
              self.text_name = "張三"
            })
這個事件就不會被移除
此時應該
1. _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillHide)
            .takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
            .subscribe(onNext: {[weak self] _ in
                print("鍵盤消失了")  
              self?.text_name = "張三"
            })
2.
 weak var weakSelf = self
        _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillHide)
            .takeUntil(self.rx.deallocated) //頁面銷燬自動移除通知監聽
            .subscribe(onNext: { _ in
                print("鍵盤消失了")  
              weakSelf?.text_name = "張三"
            })

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章