關於堆疊和block之我見

2022-04-12 04:24:38 字數 821 閱讀 6935

臨時變數存在棧裡

物件存在堆裡

關於block

c與oc最大的區別在於乙個是靜態語言乙個是動態語言

先看看c 的寫法

void testfunc() 

void testfuncpoint(void)

c語言沒有block一說,叫做函式指標,其實現機制是,函式入口是固定的,我只要知道函式入口就能正確的呼叫該函式,

因此將函式位址賦給函式指標,呼叫的時候直接使用該指標即可

再看看 oc

首先我嘗試採用c寫法,使用函式指標呼叫函式

void (*functionpoint)(void) = sayhello;

///////////////////////////////////

- (void)sayhello

實驗結果: 語法錯誤編譯器不支援該種語法

正確寫法:

testblock block = ^(int x) ;

block(5);

該種寫法實現與c有著本質區別, 其本質是將**拷貝至堆區並保留特定堆區指標,在呼叫的時候將位址賦給cs:ip暫存器,實現跳轉至block的操作。

分析: oc是門動態語言,採用訊息傳送機制,函式的執行方法是 先找到物件 -> 讀取函式列表 -> 匹配最合適的函式指標 -> 執行

如果採用c寫法,第一必須在編譯時確定函式的位置,第二將會破壞oc的這種實現機制

所以採用block這種設計方式便在情理之中

附上oc函式結構體

struct objc_method

關於block和引用計數

1 修飾block 如果需要block在它被宣告的作用域被銷毀後繼續使用的話,你就需要做乙份拷貝。拷貝會把block移到堆裡面。所以,使用 property時設定通常如下 property copy,nonatomic void block void 2 retain cycle的問題 block在...

堆 棧和堆疊

要點 堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結 構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式...

HDFS Datanode關於block檔案的管理

資料檔案真正儲存的地方是在datanode,當使用者需要填充檔案中某乙個block的實際資料內容時,就需要連線到datanode進行實際的block寫入操作,下面我們看一下datanode如何管理block,以及如何儲存block。datanode 是通過檔案儲存block資料的 datanode中...