这节课需要讲的就是可选链,内存管理,引用计数,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的学习.