Stanford iOS10 笔记-L6 Multi-MVC &VC生命周期 等

多MVC

因为没有涉及delegate,notification等,本节主要是介绍两个MVC-master和detail VC间的 简单、单向通信方式。两个VC比较简单,并且使用了Storyboard,侧重介绍了prepare(for segue: UIStoryboardSegue, sender: Any?): 在该方法中,每次都重新生成了一个新的VC。
此外,还介绍了很多在Storyboard中的操作:

  • entry除了在inspect中修改,还可以直接拖拽箭头
  • 添加NavigationController:选中某VC,Editor->Embedded in
  • 手动“连系”SplitViewController的master和detail
  • 添加segue,注意 show 和 show details的区别:show 只用在NavigationController中

VC的生命周期

不多说了,值得注意awakeFromNib:该方法调用表明系统开始加载 nib 或 Storyboard, 也就是说 IBOutlet(任何在storyboard中添加的对象) 尚未生成。
需要再次强调的就是不要在 viewDidLoad 中修改frame。
为了说明VC的生命周期,课程中实现了打印日志功能的类 VCLLoggingViewController。 该类在各关键周期函数中重载,这样通过继承该日志类即可看到 multi-VC中各VC的运行情况。这里思考一个问题:在ObjC时代,我们通过 runtime 特性来 "一劳永逸"的添加行为日志。那么在 swift中,如何实现呢?这个留待以后解决。

内存

ARC的内容不多说了:strong、weak 和 unowned 关键字好好理解。结合closure,给出了避免循环引用的方法以及几种写法。课程中的给的closure例子是trailing closure,几种写法包括:

addUnaryOperation("✅"){ [me=self] in 
    me.display.textColor = UIColor.green
    return sqrt($0)
}
//local self will cover global self; unowned can be replaced with weak
addUnaryOperation("✅"){ [unowned self = self] in 
    me.display.textColor = UIColor.green
    return sqrt($0)
}
//weak also works
addUnaryOperation("✅"){ [unowned self] in 
    me.display.textColor = UIColor.green
    return sqrt($0)
}

Swift语法

optional 是swift的一大特色,所以在写代码的时候要注意关于optional的写法,注意总结。
级联的 if-let 可以简化:

if let a = b as? ZZPerson {
    if let c = a.address {
    }
}
//可以写成如下形式: ,分隔,if省略
if if let a = b as? ZZPerson,
     let c = a.address {
    }