Lecture2 MVC
Notes
1.lazy
延时初始化: 初始化该对象时需要用到其他还未初始化的对象,可以使用lazy懒加载,等到需要用到的对象初始化完成之后再初始化。
延时加载:优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,可以选择延时加载。另外,有些情况下我们并不会立即用到一个对象的所有属性,而默认情况下初始化时,那些在特定环境下不被使用的存储属性,也一样要被初始化和赋值,可以选择延时加载
使用lazy修饰的属性不可以再使用 didSet,因为属性被set的时间不确定。
lazy var game = ConcentrationRule(numberOfPairsOfCards: (flipCards.count + 1) / 2 )
var flipCount = 0 {
didSet {
flipCountLabel.text = "FlipCount: \(flipCount)"
}
}
2.static
updating...
3. struct vs. class
struct 是值类型,class是引用类型
struct 不可以被继承,class可以被继承
常见的数据结构如: String,Array,Dic, Set 都是struct类型
4. copy-on-write (写时复制)
在Swift中,值类型有两种。一种是定长值类型,比如数值类型Int,Double,Float,还有一些只包含定长值类型的结构体(CGPoint)等等;另外一种叫做变长值类型,比如String,数组,字典等等。定长值类型都会保存在栈上,而变长值类型则会分配堆内存。
对于值类型的变长值类型,在复制时不一定是立刻就复制,而是在写入时,改变了原来的值时才复制。
因为栈上的空间是连续的,你总是通过移动栈尾指针去开辟和释放栈内存,而变长值类型中有一些成员在初始化的时候并不能确定它所占用的内存。比如集合类型,你可以随时往里面添加和删除元素,这会导致内存的增加和减少。类似的还有字符串,在内存中储存字符串实际上是存储的每一个字符,所以对于变长值类型并不能把全部内容都保存在栈上。在Swift中用了一种很巧妙的技术来实现变长值类型,那就是Copy-On-Write。
Copy-On-Write故名思议就是写时复制,当我们对变量进行写操作的时候会触发拷贝操作。但是我们也不能在每一次写入的时候都拷贝,思考一下,如果该变量的引用计数只有1,那就没有任何拷贝的必要。所以在拷贝前我们需要检测变量的引用计数是否唯一。在swift中提供了isKnownUniquelyReferenced,它能检查一个类的实例是不是唯一的引用。