美文网首页Swift
Swift如何正确防止循环引用

Swift如何正确防止循环引用

作者: MrZhaoCn | 来源:发表于2017-03-03 23:05 被阅读6次

循环引用就是两个对象互相强引用对方,导致对象实例无法释放,那么在swift中如何防止这种循环引用呢?

一种方式是使用weak,这对OC程序员来说在熟悉不过了,在swift还有一种防止循环引用的方式就是无主引用 unowned,那他们的区别在哪?

区别: unowned 更像以前的 unsafe_unretained, 而 weak 就是以前的 weak。用通俗的话说,就是 unowned 设置以后即使它原来引用的内 容已经被释放了,它仍然会保持对被已经释放了的对象的一个 “无效的” 引用,它不能 是 Optional 值,也不会被指向 nil。如果你尝试调用这个引用的方法或者访问成员属性 的话,程序就会崩溃。而 weak 则 好一些,在引用的内容被释放后,标记为 weak 的成 员将会自动地变成 nil (因此被标记为 @weak 的变量一定需要是 Optional 值)。关于两者 使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使 用 unowned,如果存在被释放的可能,那就选择用 weak。
下面给出一个简单的应用,如在网络请求过程采用闭包进行回调,在回调的闭包里要使用self,此时就可能产生循环引用,可采用如下方式:

 YRApprovalService.loadApprovalDetail(id: id) {[weak self](sucess,error,approvalLayouts) ->Void in
            guard let weakself = self else {
                return
            }
            if sucess {
            } else {
            }
        }

相关文章

  • Swift如何正确防止循环引用

    循环引用就是两个对象互相强引用对方,导致对象实例无法释放,那么在swift中如何防止这种循环引用呢? 一种方式是使...

  • iOS swift 防止循环引用

    yourFunc就是你自己写的需要回调作为参数的函数arg 为参数上面这块代码可以避免循环引用第一次在简书写点东西...

  • iOS内存管理

    swift 中如何解决循环引用 解决类之间的循环引用 weak:弱引用, 必须为变量(var),可选类型(?),指...

  • Swift--内存管理

    Swift内存管理概述 强引用循环 打破强引用循环 闭包中的强引用循环 Swift内存管理概述 Swift中的AR...

  • swift防止循环引用简单整理

    weak 弱引用不会对其引用的实例保持强引用,因而不会阻止 ARC 销毁被引用的实例。这个特性阻止了引用变为循环强...

  • 【Swift】block防止self循环引用

    方法1、 weak var weakSelf =self self.block ={() -> () in...

  • swift-07 闭包

    输出结果 定义弱引用 防止循环引用

  • 防止循环引用

  • 平常开发中会遇到的内存泄漏

    一、Block循环引用 防止block循环引用的方法:(弱引用) __weaktypeof(self) weaks...

  • StrongSelf

    weakSelf : 防止循环引用 strongSelf: 防止释放 需要 强引用weakSelf,主要是处理一...

网友评论

    本文标题:Swift如何正确防止循环引用

    本文链接:https://www.haomeiwen.com/subject/wsxdgttx.html