swift2.0 学习笔记Thirteen

原创 2016年06月02日 12:02:36

import UIKit



class ViewController: UIViewController {

   

    override func viewDidLoad() {

        super.viewDidLoad()

        //闭包引起的循环强引用

        //循环强引用还会发生在当你将一个闭包赋值给类实例的某个属性,并且这个闭包体中又使用了这个类实例。这个闭包体中可能访问了实例的某个属性,例如self.someProperty,或者闭包中调用了实例的某个方法,例如self.someMethod.这两种情况都导致了闭包捕获self,从而产生循环强引用

        //循环引用的产生,是因为闭包和类相似,都是引用类型。当你把一个引用赋值给了闭包。实质上,这两个强引用让彼此一直有效。但是和两个类实例不同的是一个是类实例另一个是闭包。

        var paragraph:HTMLElement?=HTMLElement(name: "P", text: "hello world")

        print(paragraph!.asHTML())//P hello world P

       //HTMLElement类产生了类实例和asHTML默认值的闭包之间的循环强引用

       /*

        {

        if let text = self.text {

        return "\(self.name) \(text) \(self.name)"

        }else{

        return "\(self.name)"

        }

        }该闭包引用了self即强引用了HTMLElement实例,

        lazy var asHTML: Void->String该变量又强引用了闭包

         */

        paragraph=nil  //不会触发deinit析构函数

        

        //解决闭包引起的循环强引用

        //在定义闭包时同时定义捕获列表作为闭包的一部分,通过这种方式可以解决闭包和类实例之间的循环强引用。捕获列表定义了闭包体内捕获一个或者多个引用类型的规则

        //捕获列表中的每一项都由一对元素组成,一个元素是weakunowned关键字,另一个元素是类实例的引用。这些项在方括号中用逗号分开

        //如果闭包有参数列表和返回类型,把捕获列表放在它们前面

      

        var paragraph2:HTMLElement?=HTMLElement(name: "P", text: "hello world")

        print(paragraph2!.asHTML2())//P hello world P

                                    //P is being deinit

        //注意:如果被捕获的引用绝对不会变为nil,应该用无主引用,而不是弱引用,弱引用总是可选类型,并且当引用的实例被销毁后,弱引用的值会自动置为nil

    }

   

}

class HTMLElement{

    lazy var asHTML2: Void->String = {

        [unowned self] in           //用无主引用而不是强引用来捕获self

        if let text = self.text {

            return "\(self.name) \(text) \(self.name)"

        }else{

            return "\(self.name)"

        }

    }

    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 deinit")

    }

    

}

//lazy var someClosure: Void -> String = {

//    [unowned self, weak delegate = self.delegate!] in

//    // closure body goes here

//}


版权声明:本文为博主原创文章,未经博主允许不得转载。

如何快速将Swift2.0的项目过渡到Swift3.0

如何快速将Swift2.0的项目过渡到Swift3.0 今年WWDC之后,相信大家都已经更新到iOS10和Xcode8.0beta版本尝鲜了,其中包括SiriKit、新的语音识别框架SFSpeechR...
  • wj610671226
  • wj610671226
  • 2016年06月29日 21:14
  • 8462

swift2.0 学习笔记Eleven

import UIKit class ViewController: UIViewController {       override func viewDidLoa...
  • Dlg1992
  • Dlg1992
  • 2016年05月31日 18:22
  • 160

swift2.0 学习笔记Sixteen

import UIKit class MediaItem {     var name : String     init(name:String){         sel...
  • Dlg1992
  • Dlg1992
  • 2016年06月17日 09:52
  • 101

swift2.0 学习笔记seven

//类和结构体 //共同点:1.定义属性用于存储值 2.定义方法用于提供功能 //3.定义构造器用于生成初始化值 4.通过扩展以增加默认实现的功能 //5.实现协议以提供某种标准功能...
  • Dlg1992
  • Dlg1992
  • 2016年04月29日 12:05
  • 153

swift2.0学习笔记之网络请求

swift2.0中xcode本身的info.plist中并没有设置使用https请求设置,所以当url请求的网址是https形式的网址时,是不会有数据反应的 要在xcode的info.plist中加...
  • lxslx
  • lxslx
  • 2015年12月15日 13:07
  • 207

swift2.0 学习笔记five

//枚举     enum CompassPoint {         case North         case South         case East ...
  • Dlg1992
  • Dlg1992
  • 2016年04月27日 18:47
  • 161

swift2.0 学习笔记Fourteen

import UIKit class ViewController: UIViewController {         override func vi...
  • Dlg1992
  • Dlg1992
  • 2016年06月03日 09:45
  • 200

Swift2.0学习笔记(整理版)

网上找到了大神讲解的Swift2.0基础版 根据 视频 整理出 有关swift2.0的基础 和大家分享 也提醒自己 要学好它 打算以后用 swift开发 /* 1.hello swift */ pri...
  • JXT141014_150214
  • JXT141014_150214
  • 2016年03月17日 11:52
  • 575

swift2.0 学习笔记Fifteen

enum VendingMachineError:ErrorType{     case InvaildSelection //选择无效     case InsufficientFun...
  • Dlg1992
  • Dlg1992
  • 2016年06月13日 10:23
  • 199

swift2.0 学习笔记four

override func viewDidLoad() {         super.viewDidLoad()         //        let age = -3   ...
  • Dlg1992
  • Dlg1992
  • 2016年04月27日 14:39
  • 152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:swift2.0 学习笔记Thirteen
举报原因:
原因补充:

(最多只允许输入30个字)