美文网首页
iOS开发Block详解

iOS开发Block详解

作者: 爱看书de图图 | 来源:发表于2018-10-11 18:41 被阅读216次

block

  Block:带有自动变量(局部变量)的匿名函数,它是C语言的扩充功能。之所以是拓展,是因为C语言不允许存在这样匿名函数。在Block中访问一个外部的局部变量,Block会持用它的临时状态,自动捕获变量值,外部局部变量的变化不会影响它的的状态,下面是个小例子。

        int a = 10;
        void (^block)(void) = ^{
            NSLog(@"block = %d",a);
        };
        a = 5;
        block();//结果为10

是否会对变量捕获遵循以下原则


block变量捕获
block的本质
  • block本质上是一个OC对象,它内部也有个isa指针
  • block是封装了函数调用以及函数调用环境的OC对象
block的类型
block的类型
block类型的判断标准
block判断标准
block的copy

在ARC环境下,编译器会根据情况自动将栈上的block拷贝到堆上,比如
1、block作为函数返回值时
2、将block赋值给__strong指针时
3、block作为cocoa API中方法名含有usingBlock的方法参数时
4、block作为GCD API的方法参数时

对象类型的auto变量

1、当block内部访问了对象类型的auto变量时,如果block是在栈上,将不会对auto变量产生强引用
2、如果block被拷贝到堆上,会调用block内部的copy函数,copy函数内部会调用_Block_object_assign函数,_Block_object_assign会根据auto变量的修饰符(__strong,__weak,__unsafe_unretained)做出相应的操作,类似于retain(行程强应用、弱引用)
3、如果block从对上移除,会调用block内部的dispose函数,内部会调用_Block_object_dispose函数,这个函数会自动释放引用的auto变量,类似于release

__block修饰符

__block可以用于解决block内部无法修改auto变量值得问题
__block不能修改全局变量、静态变量(static
编译器会将__block变量包装成一个对象

block产生的循环引用解决办法

__weak__unsafe_unretained解决
__block解决

        __unsafe_unretained id weakSelf = self;
        self.block = ^{
        };
        __block id weakSelf = self;
        self.block = ^{
        };

  相信通过这片文章,大家对block有了一个全新的认识,希望有不足之处,大家可以指出,然后完善。

相关文章

  • iOS Block实例

    iOS之Block详解:Block详解 ViewController.h(ARC) ViewController....

  • iOS开发---Block详解

    iOS开发---Block详解 Block的基础 什么是Blocks? 用一句话来描述:带有自动变量的匿名函数(是...

  • iOS开发Block详解

    block   Block:带有自动变量(局部变量)的匿名函数,它是C语言的扩充功能。之所以是拓展,是因为C语言不...

  • iOS开发-由浅至深学习block

    iOS开发-由浅至深学习block iOS开发-由浅至深学习block

  • iOS 题目详解 部分三

    主要讲解Block 内部使用strongSelf的理由和用法 iOS 题目详解 部分一iOS 题目详解 部分二...

  • Block - block简单的使用

    参考文档 iOS Block详解 一、忘记block格式? 样例一.png 样例二.png 二、Block的定义 ...

  • sweet笔记_UIView的transform属性

    iOS开发UIView的transform属性详解 本文主要是详解iOS开发UIView的transform属性,...

  • GCD并发Dispatch Queues

    详解IOS开发应用之并发Dispatch Queues 详解IOS开发应用之并发Dispatch Queues是本...

  • iOS开发Block使用详解

    项目开发中经常会用到页面之间传值的问题,常用的方法是通知、单例、代理、block等。最近项目忙完,有空细细研究了一...

  • iOS开发相关网址

    //block详解(清晰明了)http://www.cocoachina.com/ios/20160414/159...

网友评论

      本文标题:iOS开发Block详解

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