美文网首页
00Swift中闭包的循环引用

00Swift中闭包的循环引用

作者: i爱吃土豆的猫 | 来源:发表于2016-08-02 17:20 被阅读36次

    1.闭包的循环引用

    //Created by zhangmi on 15/2/28.
    //Copyright © 2016年Paramount Pictures. All rights reserved.

    importUIKit
    classViewController: UIViewController{
    //vc -- strong --闭包
    //闭包-- strong -- vc相互强引用
    //定义属性闭包
    
    //swift属性的默认就是强引用
    var finished Callback: ((res:String) -> ())?
       override func viewDidLoad() {
    super.viewDidLoad()
    
    1.1swift中特殊的写法1
    //weak var weakSelf = self
    loadData { [unownedself] (result)in
       print(result,self)}}
    

    //[unowned self]和__unsafe__retained作用类似-->对象被回收时,内存地址不会自动指向nil,会造成野指针访问

    1.2.swift中解决办法1
    func method InSwift2() {
    

    //2.swift中特殊的写法

    //weak var weakSelf = self
    loadData { [unownedself] (result)in
    print(result,self)}}
    

    //2. swift中解决办法1
    //[weak self]和__weak typedod(self)作用类似-->对象被回收时,内存地址不会自动指向nil,更加安全,推荐使用这种方式

    funcmethodInSwift1() {
    

    //1.swift中特殊的写法

    //weak var weakSelf = self
    loadData { [weakself] (result)in
    print(result,self)
        }
    }
    

    2.解决循环引用的方式

    funcmethodInOC() {
    

    //1.仿照oc解决
    //弱引用的对象有一次执行nil的机会

    weak var weakSelf =self
    loadData { (result)in
    print(result, weakSelf)
        }
    }
    funcloadData(finished: (result:String) -> ()) {
    finished  Callback = finished
    dispatch_async(dispatch_get_global_queue(0,0)){
    NSThread.sleepForTimeInterval(2)
    //在主队列回调
    dispatch_async(dispatch_get_main_queue(),{
    //执行闭包
    finished(result:"办证: 12345678910")
            })
        }
    }
    //dealloc oc
    //析构函数
    deinit{
        print("我已经销毁")}
    

    3. 三种解决办法的总结:

    //1.解决循环引用的方式,仿照oc解决
    //弱引用的对象有一次执行nil的机会

     funcmethodInOC() {
         *weak var weakSelf =self*
    loadData { (result)in
         print(result, weakSelf)
    }
    

    //2. swift中解决办法1
    swift中特殊的写法
    //[weak self]和__weak typedod(self)作用类似-->对象被回收时,内存地址不会自动指向nil,更加安全,推荐使用这种方式

     funcmethodInSwift1() {
        loadData{ [*weak self]* (result)in
            print(result, self)
        }
    }
    

    //3.swift中解决办法2
    [unowned self]和__unsafe__retained作用类似-->对象被回收时,内存地址不会自动指向nil,会造成野指针访问

     funcmethodInSwift2() {
        loadData{ [unowned  self] (result)in
                print(result, self)
         }
     }

    相关文章

      网友评论

          本文标题:00Swift中闭包的循环引用

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