美文网首页
iOS block小笔记

iOS block小笔记

作者: 叫我魏大川 | 来源:发表于2020-05-30 20:19 被阅读0次

1:block捕获局部变量的能力:无论是基础数据类型还是对象,被捕获的都是局部变量里所存储的瞬时值,所以局部变量本身里面的存储值没法被更改。只不过,如果局部变量里存的是个对象的内存地址,那block截获的实际是那个对象的地址,当然能更改对象的属性。
block只有用了那个局部变量,才会捕获谁,所以block是有size的。
注意block捕获变量的时机,在block被创建时变量即被捕获。并不是等到执行此block代码块时才捕获变量。

2:那如果局部变量加了__block呢,那就不会捕获瞬时值了,相当于正常访问,捕获(或叫复制)的是其本身的内存地址。将其封装成了一个放在堆上的结构体,以方便从栈上和堆上访问和修改同一份数据,即使局部变量被释放了,在block内依然能继续访问。 所以可以正常修改等操作。加了static关键字,也能达到相似的效果。

3:循环引用问题
达到循环引用的条件:block中持有的对象,直接或间接的持有本block。
但作为函数参数的block中,访问self会不会造成循环引用呢,答案是不会的。因为作为方法参数的block体并没有被任何方持有,是栈block,出了作用域即释放。
所以,在gcd、Masonery或者网络请求封装成的回调block中,直接访问self并不会造成循环引用。但是有一点要注意,在block中再有block使用直接或间接使用self时,最好使用__strong保持self,不然使用时可能已经被释放成nil 。

4:block类型
block分为栈 、 堆 、全局block。
堆block不能被直接创建,只能被copy到堆上。
因为block变量默认是声明在栈变量上的,为了能在block的声明域外使用,所以要把block copy到堆上。所以说,为了block属性声明和实际的操作一致,做好声明为copy。
全局block:定义全局区变量的地方有block语法时;block语法的表达式中没有使用到应截获的自动变量时。
栈block:在某个方法中,捕获并使用了局部变量;
堆block:调用Block的copy实例方法时;
Block作为函数返回值返回时;
将Block赋值给附有__strong修饰符id类型的类或Block类型成员变量时;
将方法名中含有usingBlock的Cocoa框架方法或GCD的API中传递Block时;

5:block的作用
本质是匿名函数,再本质就是结构体。
可作为属性、参数或返回值。
作为参数、属性、或返回值时,block可传入参数,实现block体,达到回调的效果。

相关文章

  • iOS block小笔记

    1:block捕获局部变量的能力:无论是基础数据类型还是对象,被捕获的都是局部变量里所存储的瞬时值,所以局部变量本...

  • iOS-2 Block

    block块 系列文章: iOS Block浅浅析 - 简书 iOS Block实现原理 iOS Block __...

  • iOS Block存储域及循环引用

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block __block说明符...

  • iOS Block实现原理

    系列文章:iOS Block概念、语法及基本使用iOS Block __block说明符iOS Block存储域及...

  • iOS Block __block说明符

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block存储域及循环引用 上一...

  • iOS复习之Block

    iOS面试中如何优雅回答Block iOS block循环引用

  • iOS~Block 笔记

    推荐文章深入研究Block捕获外部变量和__block实现原理Automatic Reference Counti...

  • 笔记:iOS block

    代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,...

  • block系列文章总结

    iOS源码解析:Block的本质<一>iOS源码解析:Block的本质<二>Objective C block背后...

  • Block初步接触

    OC 日常笔记碎片知识 Block基本概念Block是iOS中一种比较特殊的数据类型. 苹果推荐使用的数据类型,应...

网友评论

      本文标题:iOS block小笔记

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