原创 二叉樹

介紹二叉樹之前先說下樹狀結構,不同於線性結構只有前後兩個方向,樹狀結構可以有多個方向。 樹的基本概念 節點、根節點、父節點、子節點、兄弟節點 如上圖中的每個元素都一個節點,節點A是根節點,A是B和C的父節點,B和C是A的子節點,B和C互

原创

棧是這樣一種數據結構,越先存入棧中的數據,越後從棧中移除。後進者先出,先進者後出,這就是典型的棧結構。 當某個數據集合只涉及在一段插入和刪除數據,且滿足後進先出、先進後出的特性,應該首選棧這種數據結構。 棧的實現 棧可以用鏈表和數組實現,用

原创 鏈表

鏈表通過指針將一組零散的內存塊串聯在一起,每個內存塊稱爲鏈表的結點。 這篇文章介紹三種常見的鏈表結構:單向鏈表、雙向鏈表、循環鏈表。 單向鏈表 單向鏈表只有一個方向,結點只有一個後繼指針next指向後面的結點。單項鍊表有兩個點比較特殊。第

原创 數組

什麼是數組? 數組是一種線性表數據結構,它用一組連續的內存空間存儲一組相同類型的數據。 定義中牽扯到幾個關鍵詞: 線性表 線性表就是數據排成像一條線的結構,每個線性表上的數據最多隻有前和後兩個方向。與線性表對立的是非線性表,如二叉樹、堆、

原创 複雜度分析

爲什麼要學習複雜度分析? 我們用開發工具將代碼跑一遍,通過統計和監控就能得到算法執行的時間和佔用的內存,爲什麼還要做算法的時間和空間複雜度分析?這種統計複雜度的方法我們稱爲"事後統計法 ",這種統計方法有如下侷限性: 測試結果依賴測試環境

原创 Mac搭建flutter環境

設置flutter鏡像 查看路徑/Users/YourMacUserName/下是否有.bash_profile文件,有則打開,沒有則新建.bash_profile: 啓動終端Terminal 進入當前用戶的home目錄 cd ~ 創建.

原创 Native與Flutter通信

Flutter與Native之間通過Channel進行通信。消息使用Channel在客戶端和主機之間傳遞,且Flutter中消息的傳遞是異步的,如下如所示: Flutter中定義了三種類型的Channel BasicMessageCh

原创 iOS項目集成FLutter

本文是在FLutter環境已經搭建好的前提下,記錄如何向iOS原生項目中集成Flutter。 創建FLutter module 打開終端 ,進入原生項目的上一級目錄,如項目目錄是:xxx/FlutterProject/FlutterHyb

原创 weak的實現原理總結

Runtime維護了一個全局的weak表weak_table,weak_table表是個散列表,key是weak指針指向對象的地址,value是weak_entry_t對象,weak_entry_t存儲着所有指向該對象的weak指針地址數組

原创 autoreleasePool總結

先舉個例子,下面這段代碼是在非ARC環境下運行: @autoreleasepool { AutoRelaseObj *obj = [[AutoRelaseObj new] autorelease]; NSLog(@"\n

原创 iOS線程同步方案總結

demo: ThreadSynchronization 多線程技術使得執行任務的效率得到提升,但多線程也是一個易發生各種問題的編程技術。如數據競爭(多個線程更新相同資源導致數據不一致)、死鎖(多個線程相互等待)、太多線程會銷燬大量內存等問題

原创 Runtime常用API

Runtime API demo 類相關 動態創建一個類(參數:父類,類名,額爲的內存空間) objc_allocateClassPair(Class _Nullable superclass, const char * _Nonnul

原创 Block訪問對象類型

在上篇文章中有說到ARC環境下,編譯器會根據情況自動將棧上的block拷貝到堆上,具體情況以下: block作爲函數返回值時 將block賦值給強指針時 block作爲Cocoa API中方法名含有usingBlock的方法參數時 blo

原创 Class的結構及方法緩存

從runtime源碼中看到Class的結構如下 struct objc_class : objc_object { // Class ISA; Class superclass; cache_t cache;

原创 OC消息發送機制

OC的方法調用都是通過消息發送這種機制來實現的。當調用一個實例方法或者類方法時,底層實現是實例對象或者類對象調用objc_msgSend函數。先看個例子: - (void)viewDidLoad { [super viewDidLo