ARC之解决闭包引起的循环强引用
2015-08-25 11:05
274 查看
copy自:swift2.0官方教程中文版---极客学院版
1.产生闭包之间的循环强引用
直接代码和上图:
变量定义为 可选HTMLElement ,因此我们可以赋值 nil 给它来演示循环强引用。
![](http://img.blog.csdn.net/20150825104822713?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2.解决闭包之间的循环强引用
![](http://img.blog.csdn.net/20150825105433626?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
闭包内的捕获定义:
1.无主引用,在闭包和捕获的实例总是互相引用时并且总是同时销毁时
2.弱引用,在被捕获的引用可能会变为 nil 时
定义捕获列表
捕获列表中的每一项都由一对元素组成,一个元素是 weak 或 unowned 关键字,另一个元素是类实例的引用(如 self )或初始化过的变量(如 delegate = self.delegate! )。这些项在方括号中用逗号分开。
如果闭包有参数列表和返回类型,把捕获列表放在它们前面:
lazy var someClosure: (Int, String) -> String = {
[unowned self, weak delegate = self.delegate!] (index: Int, stringToProcess: String) -> String in
// closure body goes here
}
如果闭包没有指明参数列表或者返回类型,即它们会通过上下文推断,那么可以把捕获列表和关键字 in 放在闭包最开始的地方:
lazy var someClosure: Void -> String = {
[unowned self, weak delegate = self.delegate!] in
// closure body goes here
}
1.产生闭包之间的循环强引用
直接代码和上图:
class HTMLElement { let name: String let text: String? lazy var asHTML: Void -> String = { if let text = self.text { return "<\(self.name)>\(text)</\(self.name)>" } else { return "<\(self.name) />" } } init(name: String, text: String? = nil) { self.name = name self.text = text } deinit { print("\(name) is being deinitialized") } }
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world") print(paragraph!.asHTML()) // prints"hello, world"注意: 上面的 paragraph
变量定义为 可选HTMLElement ,因此我们可以赋值 nil 给它来演示循环强引用。
2.解决闭包之间的循环强引用
class HTMLElement { let name: String let text: String? lazy var asHTML: Void -> String = { [unowned self] in // 这里加上占有列表 if let text = self.text { return "<\(self.name)>\(text)</\(self.name)>" } else { return "<\(self.name) />" } } init(name: String, text: String? = nil) { self.name = name self.text = text } deinit { print("\(name) is being deinitialized") } }
闭包内的捕获定义:
1.无主引用,在闭包和捕获的实例总是互相引用时并且总是同时销毁时
2.弱引用,在被捕获的引用可能会变为 nil 时
定义捕获列表
捕获列表中的每一项都由一对元素组成,一个元素是 weak 或 unowned 关键字,另一个元素是类实例的引用(如 self )或初始化过的变量(如 delegate = self.delegate! )。这些项在方括号中用逗号分开。
如果闭包有参数列表和返回类型,把捕获列表放在它们前面:
lazy var someClosure: (Int, String) -> String = {
[unowned self, weak delegate = self.delegate!] (index: Int, stringToProcess: String) -> String in
// closure body goes here
}
如果闭包没有指明参数列表或者返回类型,即它们会通过上下文推断,那么可以把捕获列表和关键字 in 放在闭包最开始的地方:
lazy var someClosure: Void -> String = {
[unowned self, weak delegate = self.delegate!] in
// closure body goes here
}
相关文章推荐
- 【加权并查集】【只需要写merge其他直接模板】
- Ubuntu14.04 64 安装nginx之 缺少 libpcre.so.1
- 芯片手册查询网站
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
- jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
- 获取UILabel每一行显示的文字(UILabel 最后一行显示标签)
- redis
- jsch记录
- 《Java实战开发经典》第五章5.5
- 数据归一化方法
- Android-Code-Style
- Nginx基础知识. Nginx模块开发
- Android 单元测试(三)总结
- VS2015 cordova尝试-camera
- 正则表达式在iOS中的运用(附手机密码邮箱等正则判断)
- Hibernate的HQL查询及原生sql查询语句写法
- “System.Resources.MissingManifestResourceException”类型的未经处理的异常在 mscorlib.dll 中发生
- nodejs安装:nodejs入门
- Android中IntentService与Service的区别
- C#时间戳转换DateTime