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