Android面試送分題:為什麼Flutter能最好地改變移動開發?講的明明白白!

安卓開發程式設計師發表於2020-12-26

前言

網際網路時代的到來,讓我們獲取知識變得更加簡單,理論上講只要你想學,便會有不盡的知識等你,只要方法得當,夠努力,任何人都可以都有可能成為大牛。

自己在努力的基礎上,還學習了一些高效的學習方法,讓我在學習的過程中更加高效,更迅速的掌握,以下是我學習Android的一些套路。

面試官: 說一下垃圾回收機制吧

我: …可以通過強、弱引用計數結合方式解決引用計數的迴圈引用問題,實際上 Android 的智慧指標就是這樣實現的…

智慧指標

智慧指標在整個 Android 工程中使用很廣泛,在 binder 相關原始碼可以看到 sp、wp 型別的引用:

 sp<IBinder> result = new BpBinder(handle);

 wp<IBinder> result = new BpBinder(handle);

sp 即 strong pointer 強指標引用;wp 是 weak pointer 弱指標引用。

在 Java 中我們不用關心物件的銷燬及記憶體釋放,GC 機制會自動辨別回收無用物件,而 智慧指標 就是 native 層一個小型的 GC 實現。

智慧指標以引用計數的方式來標識無用物件,使用智慧指標的物件需繼承自 RefBase,RefBase 中維護了此物件的強引用數量和弱引用數量。

強指標 sp 過載了 “=” 運算子,在引用其他物件時將強引用計數 +1,在 sp 解構函式中將強引用計數 -1,當強引用計數減至 0 時銷燬引用的物件,這樣就實現了物件的自動釋放。

弱指標引用其他物件時將弱引用計數 +1,在 wp 解構函式中將弱引用計數 -1,當強引用計數為 0 時,不論弱引用計數是否為 0 都銷燬引用的物件。

如何解決迴圈引用問題

只靠強引用計數方式,會存在迴圈引用的問題,導致物件永遠無法被釋放,弱引用就是專門用來解決迴圈引用問題的:

若 A 強引用了 B,那 B 引用 A 時就需使用弱引用,當判斷是否為無用物件時僅考慮強引用計數是否為 0,不關心弱引用計數的數量

這樣就解決了迴圈引用導致物件無法釋放的問題,但這會引發野指標問題:當 B 要通過弱指標訪問 A 時,A 可能已經被銷燬了,那指向 A 的這個弱指標就變成野指標了。在這種情況下,就表示 A 確實已經不存在了,需要進行重新建立等其他操作

智慧指標自定義規則

智慧指標並不是固定的 “當強引用計數為 0 時,不論弱引用計數是否為 0 都銷燬引用的物件” ,而是可以自定義規則。RefBase 提供了 extendObjectLifetime() 方法,可以用來設定引用計數器的規則,不同規則對刪除目標物件的時機判斷也是不一樣的,包括以下三種規則:

  • OBJECT_LIFETIME_STRONG:只有在這個物件記憶體空間中的強計數器值為 0 的時候才會銷燬物件

  • OBJECT_LIFETIME_WEAK:只有在這個物件記憶體空間中的強計數器和弱計數器的值都為 0 的時候才會銷燬物件

  • OBJECT_LIFETIME_MASK:不管這兩個計數器是不是都為 0,都不銷燬物件,即與一般指標無異,還是要自己手動去釋放物件

最後為了幫助大家深刻理解Android相關知識點的原理以及面試相關知識,這裡放上相關的我搜集整理的24套騰訊、位元組跳動、阿里、百度2020-2021面試真題解析,我把技術點整理成了視訊和PDF(實際上比預期多花了不少精力),包知識脈絡 + 諸多細節

還有 高階架構技術進階腦圖、Android開發面試專題資料 幫助大家學習提升進階,也節省大家在網上搜尋資料的時間來學習,也可以分享給身邊好友一起學習。

一線網際網路面試專題

379頁的Android進階知識大全

379頁的Android進階知識大全

點選:

Android架構視訊+BAT面試專題PDF+學習筆記》即可免費獲取~

E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)》即可免費獲取~

網上學習 Android的資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那麼很難做到真正的技術提升。希望這份系統化的技術體系對大家有一個方向參考。

相關文章