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

  block又称闭包,它的实现原理是c语言的函数指针。函数指针即使函数在内存中的地址,通过访问内存中的地址实现访问函数的目的。经常和gcd结合使用,代码简洁高效。

  定义:typedef void(^SpeechRecognitionBlock)(NSString * _Nullable contentText);

  依次为类型、返回值类型、block名称、参数及其类型。block的方法体在运行时才会调用,很好的体现运行时的特性。

  应用场景:1、作为变量使用 2、作为属性使用 3、作为方法参数使用。

  @property (nonatomic, copy) SpeechRecognitionBlock speechRecognitionBlock;

  常用类型:全局块、栈块、堆块;

  存储域:

  全局块:存于全局内存中,类似于单例;

  栈块:在block内访问外部变量,存于栈内存中,超出外部变量的作用域马上销毁;

  堆块:存于堆内存中,有一个引用计数的对象,自动管理其内存;

  block的存储位置:

  1、在block内没有对外部变量的使用,存于全局块中;

  2、block访问外部变量,mrc环境下,访问外界变量的block默认存储于栈中;arc环境下,访问外界变量的block默认存储于堆中;

  ARC下,访问外界变量的 Block为什么要自动从栈区拷贝到堆区呢?栈上的Block,如果其所属的变量作用域结束,该Block就被废弃,如同一般的自动变量。当然,Block中的__block变量也同时被废弃。为了解决栈块在其变量作用域结束之后被废弃(释放)的问题,我们需要把Block复制到堆中,延长其生命周期。开启ARC时,大多数情况下编译器会恰当地进行判断是否有需要将Block从栈复制到堆,如果有,自动生成将Block从栈上复制到堆上的代码。Block的复制操作执行的是copy实例方法。Block只要调用了copy方法,栈块就会变成堆块。

  循环引用:某个类将 block 作为自己的属性变量,然后该类在 block 的方法体里面又使用了该类本身。

  self.someBlock = ^(Type var){

        [self dosomething];
   };

解决方案:arc环境下weak,mrc环境下_block;
 

参考地址:https://www.jianshu.com/p/e1cb2c9e749f

iOS开发Block使用详解的更多相关文章

  1. iOS开发——GCD多线程详解

    GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...

  2. iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...

  3. iOS开发-继承特征详解

    面向对象的三大特性:封装,继承,多态. 1.继承 继承既能保证类的完整,又能简化代码. 把公共的方法和实例变量写在子类,子类只需要写父类独有的实例变量和方法即可. 继承是面向对象三大特性之一,合理的继 ...

  4. ios开发之--UIViewContentMode详解

    在开发当中有时会有这样的需求,将从服务器端下载下来的图片添加到imageView 当中展示,但是下载下来的图片尺寸大小不固定,宽高也有可能不成比例 如果直接设置imageView的image属性而不设 ...

  5. iOS开发——Block详解

    iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...

  6. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  7. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  8. ios新特征 ARC详解

    IOS ARC 分类: IOS ARC2013-01-17 09:16 2069人阅读 评论(0) 收藏 举报   目录(?)[+]   关闭工程的ARC(Automatic Reference Co ...

  9. iOS开发--Block

    iOS开发--Block 1.什么是Block,block 的作用 ui开发和网络常见功能实现回调,按钮的事件处理方法是回调方法以及网络下载后的回调处理 (1)按钮 target-action   一 ...

  10. iOS 单元测试之XCTest详解(一)

    iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...

随机推荐

  1. 低代码如何借助 K8s 实现高并发支持?

    引言 在当今这个数字化时代,互联网的普及和技术的飞速发展使得应用程序面临着前所未有的挑战,其中最为显著的就是高并发访问的需求.随着用户数量的激增和业务规模的扩大,如何确保应用在高并发场景下依然能够稳定 ...

  2. Ubuntu的性能模式与省电模式:进行科学计算时一定要手动将Ubuntu的CPU模式设置为性能模式

    不论是什么系统,windows11还是Ubuntu.Centos.RedHat,其运行时都有一个运行模式的概念,其实这个运行模式就是CPU的性能模式,一般可以分为性能模式和省电模式两种,当然也有介于两 ...

  3. Jax的加速层的伪代码/中间层代码的生成和查看

    地址: https://jax.readthedocs.io/en/latest/notebooks/thinking_in_jax.html#jit-mechanics-tracing-and-st ...

  4. 分段树(segment tree)的实现 —— 强化学习中 "优先级回放机制" 的重要组成部分

    分段树(segment tree)是强化学习中 "优先级回放机制" 的重要组成部分.本文针对分段树(segment tree)的一个开源版本的实现来进行分析,代码地址: https ...

  5. 如何拉取指定CPU架构的并且指定ubuntu版本的docker镜像

    拉取不同CPU架构下ubuntu22.04镜像: aarch64 (arm v8) CPU架构: docker pull --platform=linux/aarch64 ubuntu:22.04 x ...

  6. CSP_J2023总结

    维护中 T1 [CSP-J 2023] 小苹果 题目描述 小 Y 的桌子上放着 $n$ 个苹果从左到右排成一列,编号为从 $1$ 到 $n$. 小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果. 每 ...

  7. 设计模式之cglib动态代理

    什么是动态代理呢?动态代理就是在java进程运行时,通过字节码技术,动态的生成某个类的代理类.在这个代理类中,我们可以做一些额外的操作,一方面仍然保持原有的方法的能力,另外一方面还增强了这些能力.听着 ...

  8. Mac 使用 Caps Lock 键切换输入法失灵问题解决

    Mac 上的 Caps Lock 键对于多语言用户来说,除了切换输入大小写的作用外还承担着切换输入法的功能.正常情况下,轻按一下 Caps Lock 键是切换输入法,长按是切换输入大小写.然而有时这个 ...

  9. LaTeX 魔法注释

    LaTeX magic comments,有点像 shebang,不过与 shebang 有细微区别,不要搞混. % !TeX root = main.tex % !TeX program = xel ...

  10. LaTeX 编译中文文档

    介绍 LaTeX 原生不支持中文.为了添加中文的功能,我们需要引入宏包.XeLaTeX 原生支持中文.不过由于默认使用的字体是英文字体,我们需要设置中文字体之后才能用.不过由于一些原因,在使用 LaT ...