Block有以下三種類型markdown
當咱們聲明一個Block,若是這個block沒有捕獲外部變量,那麼這個Block就位於全局區,此時對NSGlobal的retain、copy、release都是無效的,ARC、MRC都是如此函數
- (void)blockType {
void(^block1)(void) = ^{
};
NSLog(@"-- block1 = %@", [block1 class]);
}
複製代碼
2021-05-17 17:36:02.791048+0800 MemoryManageDemo[37503:5056528] -- block1 = __NSGlobalBlock__
複製代碼
block捕獲了外部變量,可是沒有強引用這個block,直接打印出來spa
//NSConcrateStackBlock
int a = 10;
NSLog(@"-- block2 = %@",[^{
NSLog(@"-- a = %@",a);
} class]);
複製代碼
2021-05-17 18:35:27.662072+0800 MemoryManageDemo[57159:5148084] -- block2 = __NSStackBlock__
複製代碼
ARC環境下只有捕獲了外部變量,而且有強引用指向該Block(或作爲函數返回值),系統就會自動將NSStackBlock copy到堆上,就是NSConcrateMallocBlockcode
//NSConcrateMallocBlock
int b = 10;
void(^block3)(void) = ^{
NSLog(@"-- b = %d", b);
};
NSLog(@"-- block3 = %@", [block3 class]);
複製代碼
2021-05-17 18:37:36.525794+0800 MemoryManageDemo[57425:5151753] -- block3 = __NSMallocBlock__
複製代碼