美文网首页
关于Block的总结

关于Block的总结

作者: f48ac133a97f | 来源:发表于2020-03-19 15:32 被阅读0次

为什么block会造成循环应用呢?

如果没有__weak修饰,block会把对象从栈copy到堆区,block结束的时候无法销毁。如果有__weak修饰,则只是copy了一个指针,block结束的时候就销毁了。



总结:Block的几种形式 分为全局Block(_NSConcreteGlobalBlock)、栈Block(_NSConcreteStackBlock)、堆Block(_NSConcreteMallocBlock)三种形式

  一.其中栈Block存储在栈(stack)区,堆Block存储在堆(heap)区,全局Block存储在已初始化数据(.data)区

二.如果对栈Block进行copy,将会copy到堆区,对堆Block进行copy,将会增加引用计数,对全局Block进行copy,因为是已经初始化的,所以什么也不做。

   1、不使用外部变量的block是全局block

    NSLog(@"%@",[^{

        NSLog(@"globalBlock");

    }class]);

    //输出 __NSGlobalBlock__

    //2、使用外部变量并且未进行copy操作的block是栈block

    NSIntegernum =10;

       NSLog(@"%@",[^{

           NSLog(@"stackBlock:%zd",num);

       }class]);

    //输出 __NSGlobalBlock__

    //日常开发常用于这种情况:

    [self testWithBlock:^{

        NSLog(@"----%ld",(long)num);

    }];

    //3、对栈block进行copy操作,就是堆block,而对全局block进行copy,仍是全局block

    NSIntegernums =10;

    void(^mallocBlock)(void) = ^{

            NSLog(@"stackBlock:%zd",nums);

        };

    NSLog(@"mallocBlock:%@",[mallocBlockclass]);

    __block typeof(self) weakSelf = self;

    _testBlock = ^{

        NSLog(@"%@",weakSelf);

    };

    _testBlock();

    //4.Block捕获变量  输出age:10,num:11

    autointage =10;

    staticintnumss =25;

    void(^Block)(void) = ^{

        NSLog(@"age:%d,num:%d",age,numss);

    };

    age =20;

    numss =11;

    Block();

}

- (void)testWithBlock:(dispatch_block_t)block {

    block();

    NSLog(@"===%@",[blockclass]);

}

相关文章

  • 关于block总结

    关于block总结 block有三种: NSGlobalBlock静态区(全局区)block,这是一种特殊的blo...

  • 关于Block的总结

    为什么block会造成循环应用呢? 如果没有__weak修饰,block会把对象从栈copy到堆区,block结束...

  • OC中block底层原理总结(下)

    关于OC中block的本质结构、block的变量捕获方式请查看OC中block底层原理总结(上)需要先看懂上篇文章...

  • block 之 block的底层实现

    前言 最近在总结关于block的东西,可能会写几篇关于block的博客,语法那些就不说,这里提供一个语法的入口,我...

  • block底层实现

    最近读书,关于block的底层实现,有以下思考和总结 c++部分的相关步骤分析写在代码注释 一、block是什么 ...

  • iOS 之 block(4.4)

    本章主题,讨论 block 的嵌套 总结:可以看出block 被捕获,有 BLOCK_FIELD_IS_BLOCK...

  • OC block 原理总结

    本文重点总结 OC block 的原理,并带上一些例子,不讨论 block 的写法和应用。 block 的本质总结...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS底层原理总结 - 探寻block的本质(一)

    iOS底层原理总结 - 探寻block的本质(一) iOS底层原理总结 - 探寻block的本质(一)

网友评论

      本文标题:关于Block的总结

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