• IOS系列swift语言之课时八


    这节课需要讲的就是可选链,内存管理,引用计数,unowned解决

      1 //: Playground - noun: a place where people can play
      2 
      3 import UIKit
      4 //可选链(optional chain)
      5 //class A {
      6 //    var p: B?
      7 //    
      8 //}
      9 //
     10 //class B
     11 //{
     12 //    var p: C?
     13 //}
     14 //
     15 //class C {
     16 //    func cm() -> String {
     17 //        print("cm")
     18 //        return "abc"
     19 //    }
     20 //}
     21 //
     22 //let insa = A()
     23 //let insb = B()
     24 //let insc = C()
     25 //insa.p = insb
     26 //insb.p = insc
     27 //let insb = insa.p
     28 //var insc: C?
     29 //if insb != nil {
     30 //     insc = insb?.p
     31 //}
     32 //
     33 //if insc != nil {
     34 //    insc?.cm()
     35 //}
     36 //中间任何一个地方为nil,不报错,但导致整个结果为nil
     37 //如果没有一个地方为nil,整个表达式正常运行
     38 //if let r = insa.p?.p?.cm() {
     39 //    print(r)
     40 //}
     41 
     42 /*
     43  swift中的或者java,c#语言的内存管理,指的就是引用类型对象的管理
     44  这三个语言,值类型不需要进行内存管理,值类型是放在栈里的,程序会自动管理,不需要特别的机制
     45 
     46  三种语言的内存管理,值得就是对“堆(heap)”里面的对象的管理
     47  
     48  swift中的内存管理技术,叫做arc,自动引用计数(Auto Reference Count)   
     49  但对对象的引用计数为0时,立即销毁对象
     50  
     51  这种管理一般会产生两种错误可能
     52  1.空引用
     53  2.内存泄露(leak)
     54     某个时候,某些对象分配了内存,但因为某些原因,导致程序结束时,此对象所占的内存没有被回收
     55  我们可以控制的引用计数的数量
     56  增加的方法
     57   1.声明变量,指向某个对象(直接new或者把别的变量的值赋值给你 )
     58  
     59  减少的方法
     60  1.f = nil(表示不指向任何东西)
     61  2.变量一般会运行在函数中,变量本身是存放在栈中的
     62  所以函数结束时,此变量消失
     63  
     64  
     65  关于循环引用swift提供了两种方法来解决,一种是weak(弱),一种是unowned(未拥有)
     66  1.weak 可以修饰在可为空(?,!)的属性上
     67  2.unowned只能修饰在非可为空的属性上。
     68  
     69  */
     70 //class A {
     71 //    var p: B?
     72 //    init() {
     73 //        print("a********************")
     74 //    }
     75 //    deinit {
     76 //        print("a-----------------")
     77 //    }
     78 //}
     79 //
     80 //class B{
     81 //    var p: A?
     82 //    init() {
     83 //        print("bbbb********************")
     84 //    }
     85 //    deinit {
     86 //        print("bbbbbb-----------------")
     87 //    }
     88 //
     89 //}
     90 //下面说明的是计数的问题
     91 //let f1 = A() //此时A对象有一个引用
     92 //var f1: A? = A() //此时A对象有一个引用
     93 //var f2: A? = f1 //此时A对象有二个引用
     94 //f1 = nil
     95 //f2 = nil
     96 //A()
     97 //func test () {
     98 //    let aaaa = A()
     99 //    //aaaa.xxxxxxx
    100 //    
    101 //} //函数结束时,aaaa变量不存在了,所以没有东西指向A()对象
    102 //test()
    103 
    104 
    105 //下面说明的是循环引用的问题,导致的leak
    106 //var insa: A? = A()
    107 //var insb: B? = B()
    108 //
    109 //insa?.p = insb
    110 //insb?.p = insa
    111 //
    112 //insa = nil
    113 //insb = nil
    114 
    115 //下面演示解决办法
    116 //class A {
    117 //     var p: B?
    118 //    init() {
    119 //        print("a********************")
    120 //    }
    121 //    deinit {
    122 //        print("a-----------------")
    123 //    }
    124 //}
    125 //
    126 //class B{
    127 //    var p: A?
    128 //    init() {
    129 //        print("bbbb********************")
    130 //    }
    131 //    deinit {
    132 //        print("bbbbbb-----------------")
    133 //    }
    134 //    
    135 //}
    136 //
    137 //var insa: A? = A()
    138 //var insb: B? = B()
    139 //
    140 //insa?.p = insb
    141 //insb?.p = insa
    142 
    143 
    144 //insb = nil
    145 //
    146 //insa = nil
    147 
    148 //----------unowned解决---------------------
    149 
    150 //class A {
    151 //    var p: B?
    152 //    init() {
    153 //        print("a********************")
    154 //    }
    155 //    deinit {
    156 //        print("a-----------------")
    157 //    }
    158 //}
    159 //
    160 //class B{
    161 //    unowned var p: A
    162 //    init(a: A) {
    163 //        print("bbbb********************")
    164 //        p = a
    165 //    }
    166 //    deinit {
    167 //        print("bbbbbb-----------------")
    168 //    }
    169 //}
    170 //
    171 //var insa: A?  = A()
    172 //var insb: B? = B(a: insa!)
    173 //insa?.p = insb
    174 //insa = nil
    175 //insb = nil
    176 
    177 //闭包的循环引用问题与解决
    178 class ClosureDemo {
    179     var name = "asdfas"
    180 
    181 //    lazy var  getName:()-> Void = {
    182 //        [unowned self]  in
    183 //        //let name = "def"
    184 //        print(self.name)
    185 //    }
    186     
    187      var  getName2: ()-> Void  {
    188         get  {
    189             
    190             return {
    191                     [unowned self]  in
    192                 //let name = "def"
    193                     print(self.name)
    194             }
    195         }
    196        
    197     }
    198 
    199     
    200     deinit {
    201         print("closure-----------------")
    202     }
    203 }
    204 
    205 var cd: ClosureDemo? = ClosureDemo()
    206 //cd?.getName()
    207 //cd = nil
    208 
    209 cd?.getName2()
    210 cd  = nil

    到这里,swift语言基础的知识就结束了,之后我们就开始进行UI的学习.

  • 相关阅读:
    makefile基础(GNU)
    7z命令行工具
    使用getopt函数对windows命令行程序进行参数解析
    在iMac机os x上装win7双系统经验心得
    windows操作技巧
    【SpringBoot】SpringBoot 整合RabbitMQ(二十)
    【RabbitMQ】 RabbitMQ 基本概念及测试
    【SpringBoot】SpringBoot 整合Redis缓存(十九)
    【SpringBoot】SpringBoot 自定义starter(十七)
    【SpringBoot】SpringBoot 事件监听机制(十六)
  • 原文地址:https://www.cnblogs.com/lhh-njq-best/p/6117971.html
Copyright © 2020-2023  润新知