Swift闭包与类在循环引用中,参数与捕获传入引用类型的简单案例理解

Swift闭包与类在循环引用中,参数与捕获传入引用类型的简单案例理解

class TestView: UIView {

    var handler: ((TestView) -> Void)?
    
    func run() {
        // 此处的self是作为参数传入,可认为传入的是一个局部变量。
        // 引用在函数开始前创建,在函数结束时销毁。
        handler?(self)
    }
    
    deinit { print("deinit") }
}
// 无循环引用
class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let view = TestView()
        view.handler = { (someTestView) in
            // 本例中这里的someTestView其实就是view,
            // 但它是作为一个局部变量传入的,
            // 在闭包运行时引用,结束时销毁,所以不会造成循环引用
            print(someTestView)
        }
        view.run()
        // 运行到这里时,view作为viewDidLoad方法内的局部变量,
        // 方法结束view的引用计数减1,
        // 若没有循环引用应触发view的deinit方法。
        // 打印“deinit”
    }
}
// 循环引用
class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let view = TestView()
        view.handler = { (someTestView) in
            // 这里的view是以捕获的形式得到的,
            // 在闭包创建时就引用,而且一直保持直至闭包被销毁
            //(循环引用下互相引用无法销毁)
            print(view)
        }
        view.run()
        // 没有打印“deinit”
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值