正常情况下,使用一个NSTimer或者CADisplayLink这种类型的计时器,就需要停止,而不清楚什么时候停止,就得需要一个强引用的对象,而这种需要传入一个target,又需要一个强引用,那肯定会出现循环引用
解决方式:
1.换成Block
不管是OC还是Swift的闭包,内部都是有处理用弱引用修饰的捕获变量,内部会生成一个弱引用,这个是内部处理了,不代表所有循环引用都可以
weak var weakSelf:SVC? = self
self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { _ in
print(NSDate())
})
2.自己写这个弱化指针
创建一个中间类,把中间类传入,再用弱指针持有另一个对象,完成2强一弱就能正常释放了
class MyCADisplayLink
{
weak var inTarget:AnyObject!
var inSelector:Selector!
private var _inDis:CADisplayLink!
static func startFrom(_ target: AnyObject ,selector: Selector) -> MyCADisplayLink
{
let myDis = MyCADisplayLink()
myDis.inTarget = target
myDis.inSelector = selector
myDis._inDis = CADisplayLink(target: myDis , selector: #selector(innerRun))
myDis._inDis.add(to: RunLoop.current, forMode: .common)
return myDis
}
@objc func innerRun()
{
let _ = self.inTarget.perform(inSelector)
}
func stop(){
self._inDis.invalidate()
}
}
比如这样一个类,来简单封装一下再在ViewContoller里面调用就会出现
CADisplayLink -> myDis -- VC ,其中->表示强指针, --表示弱指针,而一个循环里面有了弱指针,就会被释放掉,因为不管多少个强指针的循环只要有一个弱指针都会被释放
几乎所有循环引用都可以用这种方式