ARC和MRC下Block的使用注意

Block

1.是一段代碼塊,只在被調(diào)用的時候執(zhí)行(類似于方法和函數(shù))

2.是一種數(shù)據(jù)類型(類似于’int’,’NSString’)

3.可以定義成臨時變量

4.可以當做參數(shù)傳遞

5.可以定義成屬性

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

7.是一個指向函數(shù)的指針(一個指針對象,block的名字就是指針的地址)

8.因為block代碼塊的內(nèi)部沒有修改和訪問外部的變量,所以函數(shù)體不會發(fā)生變化,就像NSString一樣,定義的變量都保存在常量區(qū),不會隨著定義的數(shù)量而增大空間的開辟,所以定義多個相同的代碼塊也一樣,都會保存在常量區(qū),前提是定義的代碼塊內(nèi)部不發(fā)生改變

9.只要代碼塊的函數(shù)體不發(fā)生變化,無論是ARC還是MRC它的存儲區(qū)域是一樣的,都是常量區(qū)

10.當代碼塊函數(shù)體發(fā)生變化的時候,例如訪問或者修改外部變量

int num = 10;

void(^block)() = ^{

NSLog(@"%d",num);

};

NSLog(@"%d",block);

????如果是ARC(自動)在堆區(qū) NSMallocBlock

????如果是MRC(手動)在棧區(qū) NSStackBlock

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

定義里一個block屬性為taskint num = 10;

void(^block)() = ^{

NSLog(@"%d",num);

};

self.task = block;

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

MRC環(huán)境下,在定義block為屬性時,使用copy的原因,是把block從棧區(qū)拷貝到堆區(qū),因為棧區(qū)中的變量出了作用域之后就會被銷毀,無法在全局使用,所以應(yīng)該把棧區(qū)的屬性拷貝到堆區(qū)中全局共享,這樣就不會被銷毀了,在MRC手動管理的就是堆區(qū),不需要系統(tǒng)管理,MRC環(huán)境必須使用copy把變量拷貝到全局的堆區(qū);

如果是ARC的環(huán)境下,就可以不使用copy修飾,因為ARC下的屬性本來就在堆區(qū);

很早的時候MRC的block屬性都是在棧區(qū)的,copy之后就到堆區(qū)了;

當前的ARC的block屬性默認都在堆區(qū),使用copy知識沿襲了歷史的習慣,使用strong也是沒有問題的;

12.在MRC下必須使用self.task = block;給屬性賦值,在賦值的時候會調(diào)用setter方法,會把棧區(qū)的block拷貝到堆區(qū),如果使用_task的方式賦值不會去copy,所以在MRC下屬性都用copy修飾

13.在ARC下可以使用_task,因為arc下默認屬性就是在堆區(qū)



__block修飾符

1.在block的內(nèi)部,訪問外部的變量時,block內(nèi)部會對外部的變量進行一次拷貝,在block內(nèi)部操作的是拷貝之后的副本,不會影響外部的變量,這個變量在堆區(qū)

2.在block內(nèi)部,修改外部變量,是不被允許的

3.如果非要在block內(nèi)部修改外部的變量,需要使用__block修飾外部變量

4.一旦外部的int變量(在棧區(qū))被__block標記了,如果block內(nèi)部又修改了這個變量,那么這個變量的地址會永久的被修改在堆區(qū)?

????????4.1 如果外部變量是NSMutableString這樣本身就在堆區(qū)的,在block內(nèi)部修改就不會報錯?

5.為什么在block的內(nèi)部不能修改外部的變量??

????????5.1 因為block一般是需要傳遞給另外一個類里面,block內(nèi)部的一些變量不能存儲在棧區(qū),需要存在堆區(qū),不然數(shù)據(jù)就容易丟失,這就是使用__block修飾的原因,這樣傳輸數(shù)據(jù)的時候,數(shù)據(jù)就不會丟失

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容