美文网首页
iOS 开发_深入浅出的剖析Block一、Block分类

iOS 开发_深入浅出的剖析Block一、Block分类

作者: iOS_PM_WEB_尛鹏 | 来源:发表于2018-12-20 09:50 被阅读0次

【作者前言】: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);
    });

相关文章

网友评论

      本文标题:iOS 开发_深入浅出的剖析Block一、Block分类

      本文链接:https://www.haomeiwen.com/subject/vipekqtx.html