CS193筆記 第六講 多重MVC坐梯,控制器的生命周期和內(nèi)存管理

我開始用Markdown方式來記筆記了』栈澹現(xiàn)在第十一講的視頻都已經(jīng)放出來了。為了提速吵血,內(nèi)容會記得比較簡單谎替,以記錄核心內(nèi)容為主,后面再逐步進行補充蹋辅。對本講有任何疑問钱贯,請留言,我會優(yōu)先進行更新侦另。

<h4>本講簡介:</h4> 本講通過演示來介紹秩命,最后幾分鐘時間介紹了內(nèi)存管理,主要是對引用類型對象的管理褒傅。

演示:
為FaceIt增加 Master-Detail View

Navigation View

View Controller 的生命周期

Instantiated
awakeFromNib
segue preparation happens
outlets get set
viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewWillDisappear

內(nèi)存管理
簡單來講弃锐,內(nèi)存管理是自動的或?qū)﹂_發(fā)者透明的。

ARC vs MRC vs GC
自動引用計數(shù)
手動引用計數(shù)
垃圾回收技術(shù)

Strong Weak unOwned

閉包 (Closures)

Closures: 一等公民殿托,是引用類型霹菊,居住在堆上
<pre>addUnaryOperation("?", operation: { (x: Double) -> Double in
display.textColor = UIColor.green
return sqrt(x)
} )</pre>

<pre>addUnaryOperation("?") {
self.display.textColor = UIColor.green
return sqrt($0)
} </pre>

<pre>addUnaryOperation("?") { [ unowned me = self ] in
me.display.textColor = UIColor.green
return sqrt($0)
} </pre>

這個例子有幾個知識點:
1,閉包做為最后一個參數(shù)的簡化寫法
2碌尔,介紹了一種可能產(chǎn)生內(nèi)存引用互鎖的情況
3浇辜,引入一個unowned 變量 打破循環(huán)

更容易想到的打破循環(huán)引用的
<pre>addUnaryOperation("?") { [ weak weakSelf = self ] in
weakSelf?.display.textColor = UIColor.green
return sqrt($0)
} </pre>

但還可以這樣寫

<pre>
addUnaryOperation("?") { [ weak self ] in
self?.display.textColor = UIColor.green
return sqrt($0)
}
</pre>

第十三講結(jié)尾介紹了一個需要避免memory cycle 的情況

@escaping 用于修飾閉包。閉包默認(rèn)是非逃逸的唾戚。@escaping修飾表示逃逸柳洋,即閉包的執(zhí)行會產(chǎn)生對閉包外部的訪問,或某種形式上的副效果叹坦。在Swift 3以前熊镣,閉包默認(rèn)是逃逸的, 非逃逸閉包要用@noescaping修飾。

<h4>再談绪囱!</h4>
上一講里面提到過测蹲,因為在聲明faceView時使用了!鬼吵,在使用它時是不需要加扣甲?的。但在本講中齿椅,如果在下面訪問faceView時不加琉挖?,應(yīng)用會出錯涣脚。

<pre>
//FaceViewController.swift
@IBOutlet weak var faceView: FaceView!

private func updateUI() {
    switch  expression.eyes {
    case .open:
        faceView?.eyesOpen = true
    case .closed:
        faceView?.eyesOpen = false
    case .squinting:
       faceView?.eyesOpen = false
    }
    faceView?.mouthCurvature = mouthCurvature[expression.mouth] ?? 0.0
}</ol>

</pre>

原因在于示辈,Segue總會建立新的MVC實例。而在 prepare(for segue) 中<code> faceViewController.expression = expression </code>引發(fā)了對上面的updateUI()的調(diào)用遣蚀,而此時faceView還沒有被建立矾麻,仍然為nil。所以需要加芭梯?险耀。這說明使用!后粥帚,只是對編譯器來說可以接受沒有unwrapping胰耗。但像本例的情況仍然需要。

<pre>
<ol> //EmotionsViewController.swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destinationViewController = segue.destination
if let faceViewController = destinationViewController as? FaceViewController,
let identifier = segue.identifier,
let expression = emotionalFaces[identifier] {
faceViewController.expression = expression
}
}<ol>
</pre>

<h4>課后練習(xí)</h4>
<p>在增加了navigation Controller 后芒涡,應(yīng)用啟動后直接顯示了 Face View柴灯。老師留了一個練習(xí),是希望啟動后顯示帶有三個按鈕的emotion 選擇頁面费尽。老師還給了個提示赠群,要用到后面講的delegate的內(nèi)容。在這兒我們自己實現(xiàn)一下旱幼。</p>
<ol><li>打開幫助文檔查描,在輸入框敲入 Navig,這時提示列表就回顯示出一些推薦的結(jié)果柏卤,選取 navigationController(_:willShow:animated:)
<li>根據(jù)幫助內(nèi)容我們確定這個方法會在每一頁顯示前被調(diào)用冬三。而且從幫助頁面的頂部我們可以知道這個方法屬于協(xié)議 UINavigationControllerDelegate
<li>創(chuàng)建一個新的 Cocoa Touch Class 文件,將其命名為EmotionsNavViewController缘缚,父類先不用動勾笆,后面再改。
<li>打開Main.storyboard桥滨, 選中Navigation Controller 查看 identity inspector 中的 class 為 UINavigationController窝爪。因而我們打開新建的文件弛车,將
<pre><code>class EmotionsNavViewController: ... { </code></pre> 替換為
<pre><code>class EmotionsNavViewController: UINavigationController, UINavigationControllerDelegate {</code></pre>回到 identity inspector 中將Navigation Controller 的 class 的值改為 EmotionsNavViewController
<li>在類中添加我們在第1步找到的方法
<pre> func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
}</pre><li>在這兒我們該怎么做呢?查看UINavigationController的幫助
“A navigation controller coordinates its behavior with its delegate object. The delegate object can override the pushing or popping of a view controller ... "
我們看到了 override蒲每,所以有戲纷跛。我們在willShow 方法中加入
<pre><code>popViewController(animated: true)</code></pre>運行一下,沒有效果邀杏。在新加的代碼上設(shè)一個斷點贫奠,會發(fā)現(xiàn)根本沒有被調(diào)用。
<li>在viewDidLoad()里面加入
<pre><code>delegate = self</code></pre>再次執(zhí)行程序淮阐,成功地顯示了我們想要的頁面叮阅。
<li>點一下 sad 按鈕刁品,oops泣特! FaceView 出現(xiàn)后又收回了√羲妫看來willShow中的代碼還在起作用状您。增加一個屬性
<pre>private var displayed = false</pre>然后將 willShow的內(nèi)容改為
<pre>if displayed == false {
displayed = true
popViewController(animated: true)
}</pre> command+R 運行程序。一切OK兜挨。</ol>

官方答案在第八講膏孟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拌汇,隨后出現(xiàn)的幾起案子柒桑,更是在濱河造成了極大的恐慌,老刑警劉巖噪舀,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魁淳,死亡現(xiàn)場離奇詭異,居然都是意外死亡与倡,警方通過查閱死者的電腦和手機界逛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纺座,“玉大人息拜,你說我怎么就攤上這事【幌欤” “怎么了少欺?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馋贤。 經(jīng)常有香客問我赞别,道長,這世上最難降的妖魔是什么掸掸? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任氯庆,我火速辦了婚禮蹭秋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堤撵。我一直安慰自己仁讨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布实昨。 她就那樣靜靜地躺著洞豁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荒给。 梳的紋絲不亂的頭發(fā)上丈挟,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音志电,去河邊找鬼曙咽。 笑死,一個胖子當(dāng)著我的面吹牛挑辆,可吹牛的內(nèi)容都是我干的例朱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鱼蝉,長吁一口氣:“原來是場噩夢啊……” “哼洒嗤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魁亦,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渔隶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洁奈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體间唉,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年睬魂,在試婚紗的時候發(fā)現(xiàn)自己被綠了终吼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡氯哮,死狀恐怖际跪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喉钢,我是刑警寧澤姆打,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站肠虽,受9級特大地震影響幔戏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜税课,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一闲延、第九天 我趴在偏房一處隱蔽的房頂上張望痊剖。 院中可真熱鬧,春花似錦垒玲、人聲如沸陆馁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叮贩。三九已至,卻和暖如春佛析,著一層夾襖步出監(jiān)牢的瞬間益老,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工寸莫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捺萌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓储狭,卻偏偏與公主長得像互婿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辽狈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 更好的閱讀體驗,請到個人博客閱讀: iOS中的系統(tǒng)轉(zhuǎn)場 請忽略標(biāo)題呛牲,??刮萌,本文記錄的是對下圖所示的Kind, Pre...
    CaryaLiu閱讀 2,359評論 0 1
  • 本文為大地瓜原創(chuàng),歡迎知識共享娘扩,轉(zhuǎn)載請注明出處着茸。雖然你不注明出處我也沒什么精力和你計較。作者微信號:christg...
    大地瓜123閱讀 721評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,160評論 30 470
  • /* UIViewController is a generic controller base class th...
    DanDanC閱讀 1,816評論 0 2
  • 你說天是藍(lán)的 我照著畫了 從不問 是陰 還是晴天 你說樹是綠的 我照著描了 總沒想 是在春 還是冬的庭院 你說路很...
    本無痕閱讀 201評論 0 8