【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进!
1.应用场景:
Block经常被应用于设计模式,界面传值,代码块绑定,增强项目灵活性,提升代码B格等
2.实现目标:
理解Block的类型有哪几种?
3.代码说明:
1)Block的分类
①全局Block _ _NSGlobalBlock_ _ :没有引入任何外部变量
//声明一个全局Block代码块
void (^block)(void) = ^{
NSLog(@"全局Blcok---");
};
block();///> 随时调用,增强项目灵活性
/** Block本身也是一个对象,源码中具有isa指针
-源码中:
struct Block_basic {
void *isa;
int Block_flags; // int32_t
int Block_size; // XXX should be packed into Block_flags
void (*Block_invoke)(void *);
void (*Block_copy)(void *dst, void *src); // iff BLOCK_HAS_COPY_DISPOSE
void (*Block_dispose)(void *); //iff BLOCK_HAS_COPY_DISPOSE
//long parms[0]; // where const imports, __block storage references, etc. get laid down
};
*/
NSLog(@"%@",block);
②堆Block _ _NSMallocBlock_ _ : 为何会成为堆Block? 变量本身在栈中,因为Block具备自动捕捉变量的特性,为了访问到变量,会将变量由 堆 ------> 栈
//声明一个堆Block代码块
int a = 100;
/**
为何是堆Block? 变量本身在栈中,因为Block具备自动捕捉变量的特性,为了访问到变量,会将变量由 堆 ------> 栈
*/
void (^block)(void) = ^{
NSLog(@"堆Block----%d",a);
};
block();
NSLog(@"%@",block);
③栈Block _ _NSStackBlock_ _ : 没有太大实际意义,基本没有实用。 // copy值到堆区
NSLog(@"%@",^{
NSLog(@"栈Block ---%d",a);
});
网友评论