欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

swift deinit 不被执行

程序员文章站 2024-01-14 22:33:28
...

前言:

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 = "张三"
            })

 

相关标签: weak 弱引用