ARC和MRC下Block的使用注意

2021-09-08 15:57:58 字數 1909 閱讀 4239

1.是一段**塊,只在被呼叫的時候執行(類似於方法和函式)

2.是一種資料型別(類似於』int』,』nsstring』)

3.可以定義成臨時變數

4.可以當做引數傳遞

5.可以定義成屬性

6.是一種匿名函式(重要,只有函式體,沒有函式名)

7.是乙個指向函式的指標(乙個指標物件,block的名字就是指標的位址)

8.因為block**塊的內部沒有修改和訪問外部的變數,所以函式體不會發生變化,就像nsstring一樣,定義的變數都儲存在常量區,不會隨著定義的數量而增大空間的開闢,所以定義多個相同的**塊也一樣,都會儲存在常量區,前提是定義的**塊內部不發生改變

9.只要**塊的函式體不發生變化,無論是arc還是mrc它的儲存區域是一樣的,都是常量區

10.當**塊函式體發生變化的時候,例如訪問或者修改外部變數

int num = 10;

void(^block)() = ^;

nslog(@"%d",block);

如果是arc(一般都會自動)在堆區 nsmallocblock

在arc環境下,編譯器會根據情況自動將棧上的block複製到堆上的幾種情況?

如果是mrc(手動)在棧區 nsstackblock 

11.block屬性為什麼要使用copy?

定義裡乙個block屬性為taskint num = 10;

void(^block)() = ^;

self.task = block;

nslog(@"%@--%@",block,self.task);//棧區,堆區

mrc環境下,在定義block為屬性時,使用copy的原因,是把block從棧區拷貝到堆區,

因為棧區中的變數出了作用域之後就會被銷毀,無法在全域性使用,所以應該把棧區的屬

性拷貝到堆區中全域性共享,這樣就不會被銷毀了,在mrc手動管理的就是堆區,不需要

系統管理,mrc環境必須使用copy把變數拷貝到全域性的堆區;

如果是arc的環境下,就可以不使用copy修飾,因為arc下的屬性本來就在堆區;

很早的時候mrc的block屬性都是在棧區的,copy之後就到堆區了;

當前的arc的block屬性預設都在堆區,使用copy知識沿襲了歷史的習慣,使用strong也是沒有問題的;

12.在mrc下必須使用self.task = block;給屬性賦值,在賦值的時候會呼叫setter方法,會把棧區的block拷貝到堆區,如果使用_task的方式賦值不會去copy,所以在mrc下屬性都用copy修飾

13.在arc下可以使用_task,因為arc下預設屬性就是在堆區

nsglobalblock是位於全域性區的block,它是設定在程式的資料區域(.data區)中。

nsstackblock是位於棧區,超出變數作用域,棧上的block以及  __block變數都被銷毀。

nsmallocblock是位於堆區,在變數作用域結束時不受影響。

1.在block的內部,訪問外部的變數時,block內部會對外部的變數進行一次拷貝,在block內部操作的是拷貝之後的副本,不會影響外部的變數,這個變數在堆區

2.在block內部,修改外部變數,是不被允許的

3.如果非要在block內部修改外部的變數,需要使用__block修飾外部變數

4.一旦外部的int變數(在棧區)被__block標記了,如果block內部又修改了這個變數,那麼這個變數的位址會永久的被修改在堆區 

如果外部變數是nsmutablestring這樣本身就在堆區的,在block內部修改就不會報錯 

5.為什麼在block的內部不能修改外部的變數? 

因為block一般是需要傳遞給另外乙個類裡面,block內部的一些變數不能儲存在棧區,需要存在堆區,不然資料就容易丟失,這就是使用__block修飾的原因,這樣傳輸資料的時候,資料就不會丟失

ARC和MRC下的block的記憶體分布詳解

block有三種型別,分別是 nsglobalblock 全域性block,程式被載入後被分配在程序資料段上 類似函式,位於text段 也就是常量,靜態建立的block。nsmallocblock 在程序堆上分配的block,動態建立的block。nsstackblock 程序棧上分配的block,...

block 的ARC和MRC中的區別

block屬性的宣告,首先需要用copy修飾符,因為只有copy後的block才會在堆中,棧中的block的生命週期是和棧繫結的,可以參考之前的文章 ios 非arc下返回block 另乙個需要注意的問題是關於執行緒安全,在宣告block屬性時需要確認 在呼叫block時另乙個執行緒有沒有可能去修改...

block在ARC和MRC中的區別

block在arc和mrc中的宣告引用有些區別.block可以儲存在棧中,也可以在堆中 預設儲存在棧中,不需要管理記憶體 儲存在堆中的block會對block進行retain操作 mrc block在堆中時,不想對block進行retain操作,前面加 block arc 前面加 weak或 uns...