臨時變數存在棧裡
物件存在堆裡
關於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中...