您的位置:首页 > 移动开发 > Swift

Swift 中的闭包循环引用

2016-02-17 12:42 387 查看


/*

闭包 与 OC 中的 Block 类似,
闭包
主要用于异步操作执行完成后的代码回调,网络访问结果以参数的形式传递给调用方

闭包类似于 OC 中的
Block


* 预先定义好的代码

* 在需要时执行

* 可以当作参数传递

* 可以有返回值

* 包含
self
时需要注意循环引用

1.提前准备好的一段可以执行的代码

2.可以当做参数传递

3.在需要的时候 执行闭包

4.在闭包中 访问 self 可能会出现循环引用

*/

import UIKit

class ViewController: UIViewController {

//记录闭包内容,将闭包作为了属性,而属性默认就是强引用
var finish : ((dataStr : String)->())?

override func viewDidLoad() {
super.viewDidLoad()
//swift 中的循环引用
//闭包就是OC中的block

test2()
}

func test3() {
//闭包循环引用的解决方法
//2.swift 的方法二.
//unowned 相当于 OC 中的 assign
//[unowned self]  `self`不是可选项 表示在闭包中的self对象被回收时,其指针并不会指向nil. 会有风险,造成坏地址访问,也就是野指针错误
loadData { [unowned self] (dataStr) -> () in
////最好将!换成?,这样的话如果为 nil 就不会执行任何操作
print("\(dataStr)----\(self.view)")
}
}

func test2() {

//闭包循环引用的解决方法
//2.swift 的方法一.
//weak 有机会会指向 nil
//[weak self]  `self`是可选项  表示在闭包中 self 都是弱引用的
//与 OC 中的 weak 作用一样 --> __weak
loadData { [weak self] (dataStr) -> () in
////最好将!换成?,这样的话如果为 nil 就不会执行任何操作
print("\(dataStr)----\(self?.view)")
}

}

func test1() {

//闭包循环引用的解决方法
//1.OC 的方法
weak var weakSelf = self
loadData { (dataStr) -> () in
//            print("\(dataStr)----\(weakSelf!.view)")
//最好将!换成?,这样的话如果为 nil 就不会执行任何操作
print("\(dataStr)----\(weakSelf?.view)")
}

}

func loadData(finish:(dataStr : String)->()) {
self.finish = finish
//闭包就是OC中的block
dispatch_async(dispatc
8e48
h_get_global_queue(0, 0)) { () -> Void in
//
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//主线程操作

self.working()

})
}
}

func working(){

self.finish!(dataStr: "swift中的闭包就是 block")
}

//析构函数,相当于 delloc
deinit {
print("viewController Die")
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: