生存週期:自動引用計數

前邊鋪墊了那麼多,現在終於要講到垃圾回收這個東西了。

這不是方舟……這是自動引用計數(Automatic Reference Counting),這個東西是蘋果用來管理內存的。

它的功能就是那個垃圾堆上的垃圾回收器。它能夠保證所有在堆上運行的對像被釋放後不會一直駐留在堆上。保證了那塊內存會再分配給其他要使用的對像上。

何為釋放

說到對象會不會被垃圾回收器給收走,那就要看引用會[……]

點擊跳轉以繼續閱讀

初始化器

在上一節課的末尾,我們最終明確了一個對象的創建過程,那麼,說起來創建一個對象的樣子很像是調用了一個方法,可這個方法到底是什麼呢?

初始化器

沒錯的,當我們初始化了一個類為對象的時候,我們確實調用了一個方法——初始化器。

初始化器其實就是一個特殊規定了的方法,它能夠為類進行初始化。

想像一下,如果沒有初始化器,那麼我們調用的類就一定是千篇一律的,每一次都要先創建對象,再修改它的屬性?[……]

點擊跳轉以繼續閱讀

“堆棧”:到底什麼事“堆”,什麼是“棧”?

是時候來看看對象和方法的生存空間了——想要了解面向對象,不知道方法和對象放在哪裡是一件很尷尬的事情——畢竟我們還是要面對垃圾收集器的,想要讓垃圾收集器幫你做更多的事情,我們就得一定程度上了解它的工作機制,了解方法和對象存放在哪裡,否則的話,你就又要寫出一個不堪一擊的程序來了!

我們在前邊的課程當中已經基本地提過堆的概念,沒錯,對象(實例)是放在堆上的——我將它形像地描述為“垃圾堆”。

被堆[……]

點擊跳轉以繼續閱讀

“致命方塊”:多重繼承與協議

上節課我們提到了協議,但是只講了它的一種應用方式,這節課我們就來深入地了解一下這個用起來和 class 差不多的協議究竟有什麼高深奧義。

現在,我們要再一次回顧那個可恥的繼承樹:

這裡我們寫了武器……是用來進行攻擊和防守的。那麼,作為一個遊戲,武器的模型不能夠單單只用在這一個地方,不然的話開發的成本就太大了——我們要盡可能的榨乾代碼的價值。

我們與設計師溝通以後,设计师想[……]

點擊跳轉以繼續閱讀

協議:不允許實例化的類以及必須被重寫的方法

說了方法的重寫,我們再回過頭來看看那個繼承樹:

這個看起來應該還行,我們可以創建大刀的實例,創建手槍的實例……

但是如果我要這樣寫呢?

那麼問題來了:挖掘機……

不,我們的問題是“武器”到底是個什麼東西?

我們說“動物”,人是動物,鳥是動物,狗、貓都是動物,那有沒有個動物是動物呢?

答案是没[……]

點擊跳轉以繼續閱讀

自定義:覆蓋!

說了那麼多次的重寫,這次我們就來認真的對待一下方法的重寫。

合約

我們說了,繼承就相當於是簽訂合約,我們繼承出來的子類一定要遵守這個合約,那麼就算你想要做一些合約裡沒有的事情,也要遵守合約的規範,所以,你重寫方法,也一定要符合方法的類型。

我們講過方法的類型,它以 ()->() 這樣來表示。所以,重寫的方法也一定要遵守這個類型即接收參數返回參數類型要相同……名字要相同還需要我說嗎?[……]

點擊跳轉以繼續閱讀

多肽?多態!

上一節課我們說完了繼承,那這節課我們就繼續深入,來看看繼承樹的大招是什麼。

可能我和你說起多態這個發音,你最先想到的應該是高中生物裡講的“多肽”;好吧,這兩者之間唯一相同的可能就是發音了。

繼承的意義

我們說繼承實現的意義非凡,它大大降低了我們代碼中的冗餘行數,降低了代碼的維護難度……

其實,我沒有提到繼承的另一個意義——合約。

上一節課我們做了演示,繼承代表了子類獲得了父類[……]

點擊跳轉以繼續閱讀

到底怎麼辦:“是一個”與“有一個”

上節課我們具體地講述了繼承的機制,並且也設計了一個繼承樹,那麼問題來了:我不是要問挖掘機技術哪家強?我是要問如何來確定一個類是另一個類的子類呢?我們又如何設計一個類而不是某個類中的屬性呢?

“是一個”與“有一個”

這裡我們就要用這麼一個方法來檢驗它們二者之間的關係了:

我們說,手槍是槍械——OK,沒有問題,那麼手槍這個類就是槍械的子類。

還有長劍是一把劍,是一個冷兵器——沒問題,那這樣[……]

點擊跳轉以繼續閱讀

再次回顧:繼承

我們這次一起來回顧一下之前幾節課裡提到的繼承,我們曾在初見OPEN 裡用了一個開發手機(系統)的栗子來描述繼承這個東西,相信大家還有印象。

繼承

那麼這節課我們就深入的來了解了解繼承這個概念。

這個其實也不難理解,你看,當你的父輩去世,那他們的財富就會由你繼承——好吧,這不是一件很值得開心的事情,但這畢竟是事實。[……]

點擊跳轉以繼續閱讀