block深入學習

2021-07-04 10:45:48 字數 1417 閱讀 8095

block的宣告和使用看上一節就行了。

本章主要講block內部的實現過程及原理。block的定義和函式指標非常相似

對比一下

block定義

void (^someblock)() = ^;

函式指標定義

void (*functionpionter)() = void functionname()

當然區別還是有的,block的返回型別可以省略,在block塊的結尾有分號。

block也能捕獲物件型別,就是在塊中使用例項變數。塊本身也可以視為物件。對於例項變數,前面不加__block,也能改變其值。

塊的內部結構

塊的底層可以說是函式指標,當然,裡面還有其它資訊。

這是內部結構圖。塊本身也是物件,在存放塊物件的記憶體區域中,首個變數是指向class物件的指標,該指標叫isa。和object中的isa是乙個意思。

descriptor變數是指向結構體的指標,每個塊都包含此結構體,,其中宣告了快物件的總體大小,還宣告了copy與dispose這兩個輔助函式所對應的函式指標,輔助函式在拷貝及丟棄塊物件的執行,其中還會執行一些操作,比如說,前者是拷貝物件,後者是將之釋放。

在定義塊的時候,其中所佔的記憶體區域是分配在棧中的,這就是說,塊只在定義它的那個範圍內有效,像下面的這種情況就會出現危險。

定義在if及else語句中的兩個塊都分配在棧記憶體中。編輯器會給每個塊分配好棧記憶體,然後等離開了相應的範圍之後,編輯器有可能把分配給塊的記憶體覆蓋掉。塊在if中有效,但是執行起來,時而正確,時而錯誤。

為了解決此問題,可以給物件傳送copy訊息以拷貝,就把塊從棧複製到堆記憶體了,就可以在定義它的範圍之外使用。然後塊就成帶有引用計數的物件了。所以給**加上兩個copy方法呼叫,就可以解決此問題了。

當然了,除了「棧塊」和「堆塊」之外,還有一類塊叫做「全域性塊」(global block)。這種塊不會捕捉任何狀態,執行時也無須有狀態來參與。塊所使用的整個記憶體區域,在編譯期已經完全確定了,因此,全域性快可以宣告在全域性記憶體裡,全域性域不可能被系統所**。這種塊相當於單例。下面就是全域性快:

深入學習block

首先,什麼是block?block其實就是乙個 塊,把你想要執行的 封裝在這個 塊裡,等到需要的時候再去呼叫。那block是oc物件嗎?答案是肯定的。做一道很簡單的關於block的測試題 int testblock int int num nslog d testblock testblock te...

UIApplication深入學習

新建乙個任意型別的ios應用工程,加入我們在class prefix輸入是tc,我們可以看到工程中生成乙個類 在main函式中,autoreleasepool 函式中 說明 當應用程式將要入非活動狀態執行,在此期間,應用程式不接收訊息或事件。比如來 了。說明 當應用程式入活動狀態執行,這個剛好跟上面...

深入學習CSS

什麼是css?在之前的這篇文章中已經介紹了初步的介紹,詳細請看 div加css進一步講解了css中的內容,先總結如下圖 其實在實際開發中,我們通常採用是外部樣式的匯入,這樣做的好處是對於很對有同樣設計樣式的頁面可以實現樣式的共享,這樣我們不僅僅可以節省了大量的時間,並且也方便我們可以靈活的呼叫的樣式...