美文网首页Swift
2019-01-02 swift 中发生的循环引用

2019-01-02 swift 中发生的循环引用

作者: 幸福晓杰2016 | 来源:发表于2019-01-02 12:57 被阅读17次

最近使用xcode工具检查,并没有发现循环引用。

结果最后,同事告诉我写的viewcontroller 没有释放。
我仔细检查代码,发现了一下问题和结论:

第一:swift 框架中 then 方法,传入的block是临时变量,执行完就销毁,是栈block 不存在循环引用。

第二: 被对象拥有的block ,在赋值时,会被系统转换为堆block,那么为了避免内存泄露,这里面只要用了self,或者隐式调用self的一些属性对象时,一定要加上[unowned self]

第三:swift中定义协议时,如果这样写

protocol PenguinDelegate {
    func userDidTapThePenguin()
}

class MyViewController: UIViewController {
    weak var delegate: PenguinDelegate?
}

weak 属性修饰会报错。
'weak' must not be applied to non-class-bound 'ALMHeaderViewBtnClick'; consider adding a protocol conformance that has a class bound
网上查资料得知,weak与弱引用计数有关,只能修饰对象,不能修饰协议限制的any。

修改如下,让协议继承: NSObjectProtocol 或者class 即可。
参考文章

protocol PenguinDelegate: NSObjectProtocol {
    func userDidTapThePenguin()
}

class MyViewController: UIViewController {
    weak var delegate: PenguinDelegate?
}

或者

protocol PenguinDelegate: class {
    func userDidTapThePenguin()
}

class MyViewController: UIViewController {
    weak var delegate: PenguinDelegate?
}

或者同事的方法

@objc protocol PenguinDelegate {
    func userDidTapThePenguin()
}

class MyViewController: UIViewController {
    weak var delegate: PenguinDelegate?
}

相关文章

  • Swift--内存管理

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

  • 2019-01-02 swift 中发生的循环引用

    最近使用xcode工具检查,并没有发现循环引用。 结果最后,同事告诉我写的viewcontroller 没有释放。...

  • Swift 循环引用

    Swift 循环引用 [TOC] 前言 本本主要研究的是Swift中闭包捕获外部变量时产生的循环引用。全部示例是在...

  • iOS内存管理

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

  • 关于Swift闭包的循环引用问题

    由Swift ARC内存管理以及循环引用可以得出Swift闭包中的循环引用问题,然后我写了另外一个demo去验证这...

  • Swift之循环引用

    Swift中的循环引用是怎么样的呢?我们来看看: 调用: 这样是不会引起循环引用的,为什么呢? 要循环引用还要se...

  • Swift进阶06:内存管理 & Runtime

    本文主要介绍Swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用、Runtime等 内存管理 - 强引用...

  • 391,Swift 解决循环引用的三种方法(推荐【weak se

    swift中可以通过三种方法解决循环引用的问题 利用类似oc方法解决循环引用weak var weakSelf =...

  • Day2

    1 单方向的引用不会产生循环引用。循环引用:闭包引用了self,self引用了闭包。Swift推荐使用解决循环引用...

  • Swift进阶 05:内存管理 & Runtime

    本文主要介绍Swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用与Runtime等。 内存管理-强引用 ...

网友评论

    本文标题:2019-01-02 swift 中发生的循环引用

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