蘋果Cocoa框架中關於NSView和NSViewController的關係
開始接觸蘋果的 GUI 框架時,經常對 NSView/UIView 和NSViewControoler/UIViewController 的關係感到疑惑,因為包括 Windows 介面開發在內的很多GUI框架,都只有 View,而沒有 ViewController 的概念。而且在很長一段時間的實際使用中,也經常感到 ViewController 是多餘,特別是開發自定義 View,邏輯程式碼者寫在 View 類中更方便。
雖說 View 和 ViewController 是 MVC中 的概念,但我想從記憶體管理的角度來說說為什麼 ViewController 必須存在。假設在這樣的場景,這一個使用者介面,上面隨機地生成不定數量的框,然後把我們的 subview 新增到其中一個框裡面。因為這些框是隨機生成的,所以某一個程式碼框的物件可能在生成之後又被銷燬了。如果這個框物件(也即 subview 的父節點)在被銷燬時,也把 subview 銷燬,那就不符合預期了。同時,也不能在銷燬框之前把 subview 從框中移除,因為從程式碼邏輯上這樣的實現並不優雅,而且違反很多程式碼的邏輯。
所以,subview 的記憶體應該次給父節點之外的其它物件管理,自然而然地想到給 subview 建立一個 ViewController,邏輯上表示 View 屬於 ViewController,由後者管理其記憶體,這樣邏輯上比較通。不然只能交給業務程式碼管理,這樣邏輯上不太合理。
同時,允許存在不屬於任何一個 ViewController 的獨立的 View,實踐上需要這種規則,例如我們動態地給某個父節點新增子節點,並且希望在銷燬父節點時自動銷燬子節點,因為這樣程式碼更簡潔。
所以,有兩個動機:
1. 希望有些情況下銷燬父節點時,不自動銷燬子節點。
2. 希望有些情況下銷燬父節點時,自動銷燬子節點。
解決方案是 ViewController 和引用計數。
這是 GUI 框架設計的一種思路。