循环引用问题解决

正常情况下,使用一个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 ,其中->表示强指针, --表示弱指针,而一个循环里面有了弱指针,就会被释放掉,因为不管多少个强指针的循环只要有一个弱指针都会被释放

几乎所有循环引用都可以用这种方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值