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的学习.

原文地址:https://www.cnblogs.com/lhh-njq-best/p/6117971.html