zoukankan      html  css  js  c++  java
  • 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的学习.

  • 相关阅读:
    js正则表达式中的问号使用技巧总结
    380. Insert Delete GetRandom O(1)
    34. Find First and Last Position of Element in Sorted Array
    162. Find Peak Element
    220. Contains Duplicate III
    269. Alien Dictionary
    18. 4Sum
    15. 3Sum
    224. Basic Calculator
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/lhh-njq-best/p/6117971.html
Copyright © 2011-2022 走看看