關(guān)于block

1、三種類型的block介紹

根據(jù)Block在內(nèi)存中的位置分為三種類型NSGlobalBlock,NSStackBlock, NSMallocBlock。

NSGlobalBlock:類似函數(shù),位于代碼段;

NSStackBlock:位于棧內(nèi)存,函數(shù)返回后Block將無效;

NSMallocBlock:位于堆內(nèi)存

1)全局block(__NSGlobalBlock__),定義在函數(shù)外面的block是global的;另外如果函數(shù)內(nèi)部的

block,但是沒有捕獲任何自動變量,那么它也是全局的(ARC和MRC都一樣)。

2)棧block,

在MRC下,棧block

在MRC下,使用外部變量的b1是棧block,在其內(nèi)部對棧外部變量復(fù)制,并且放到了棧區(qū)。

3)堆block則是對棧blockcopy得來。對全局block copy 不會有任何作用,返回的依然是全局block。

總結(jié):

1)ARC下

-沒有使用外部變量Global

分區(qū) 第三天(@傳智如意大師) 的第16頁

-沒有使用外部變量

-使用外部變量

2)MRC下

-沒有使用外部變量

-使用外部變量

3)對一個(gè)棧block通過copy可以得到堆block

2、block類型變量內(nèi)存管理參數(shù)為什么要使用copy?

1)如果不使用copy,使用assign帶來的問題

@property(nonatomic,assign)void(^myblock)();

定義一個(gè)Person類來演示問題

@interfacePerson : NSObject

@property(nonatomic,assign)void(^myblock)();

-(void)test;

@end

@implementationPerson

-(void)test{

int n =5;

void(^bb)()= ^{

NSLog(@"myblock! n = %d",n);

};

self.myblock= bb;

NSLog(@"self stackBlock --->%@",self.myblock);

NSLog(@"self stackBlock --->%@",self.myblock);

}

@end

在ARC下測試:self.myblock應(yīng)該為堆區(qū),而實(shí)際打印出來卻為棧區(qū).

在MRC下測試:在MRC下,使用了外部變量n,blook在棧區(qū).

由此可知,不管再M(fèi)RC還是在ARC,使用assign修飾的block,都是棧block.

如果使用copy后,則 棧block -----copy-------得到的是堆block,不會出現(xiàn)問題。

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

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

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