Android面試送分題:為什麼Flutter能最好地改變移動開發?講的明明白白!
前言
網際網路時代的到來,讓我們獲取知識變得更加簡單,理論上講只要你想學,便會有不盡的知識等你,只要方法得當,夠努力,任何人都可以都有可能成為大牛。
自己在努力的基礎上,還學習了一些高效的學習方法,讓我在學習的過程中更加高效,更迅速的掌握,以下是我學習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開發面試專題資料 幫助大家學習提升進階,也節省大家在網上搜尋資料的時間來學習,也可以分享給身邊好友一起學習。
點選:
《Android架構視訊+BAT面試專題PDF+學習筆記》即可免費獲取~
E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)》即可免費獲取~
網上學習 Android的資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那麼很難做到真正的技術提升。希望這份系統化的技術體系對大家有一個方向參考。
相關文章
- [譯] 為什麼 Flutter 能最好地改變移動開發Flutter移動開發
- Android開發前景怎麼樣?為什麼Flutter能最好地改變移動開發?再不刷題就晚了!AndroidFlutter移動開發
- 為什麼我認為Flutter是移動應用程式開發的未來Flutter
- 我為什麼認為Flutter是移動應用程式開發的未來?Flutter
- 移動開發面試常用題移動開發面試
- 面試:講講 Android 的事件分發機制面試Android事件
- 可能是講解 Android 事件分發最好的文章Android事件
- 移動開發—iOS日常面試問題移動開發iOS面試
- 為什麼需要改變RAN的架構?架構
- 為什麼移動端跨平臺開發不靠譜?
- Android面試送分題:Android面試真題解析火爆全網,建議收藏Android面試
- 我為什麼用Flutter開發-2年開發心得Flutter
- 為什麼說自動化特徵工程將改變機器學習的方式特徵工程機器學習
- 為什麼開源資料庫改變許可證?資料庫
- 學 Flutter,能挽救Android 開發嗎?FlutterAndroid
- Android開發為什麼要用MVP?AndroidMVP
- 為什麼我認為《變數》是最好的塔防之一變數
- Android開發進階1 思維改變 如何知道我需要學什麼(上)Android
- Android開發——Java程式碼動態改變顏色字型的方法AndroidJava
- 我能為開源做些什麼?
- 移動前端開發和 Web 前端開發的區別是什麼?前端Web
- 自繪引擎時代,為什麼Flutter能突出重圍?Flutter
- [python]為什麼父類的值沒有改變Python
- 面試題。為什麼輸出BBBBB?面試題
- Android 事件分發完全解析之為什麼是她Android事件
- PHP需要改變什麼PHP
- 移動端開發新趨勢FlutterFlutter
- 【移動端開發】移動端開發基礎問題
- 技術改變世界 開啟移動時代的新篇章
- 【Android基礎】講講Android的事件分發機制Android事件
- android移動開發簡單的開發例項Android移動開發
- Flutter #0 移動開發技術簡介Flutter移動開發
- 嵌入式開發主要分為幾類?分別是什麼?
- 為什麼 Django 能持續統治 Python 開發世界DjangoPython
- 為什麼零程式碼開發平臺能夠快速完成應用程式的開發
- 為什麼區塊鏈準備改變這個時代區塊鏈
- Android開發實戰講解!GitHub上標星13k的《Android面試突擊版》,面試真題解析AndroidGithub面試
- flutter之改變CupertinoSwitch的大小Flutter