前言:
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 = "张三"
})
版权声明:本文为qq_40023759原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。