iOS开发Block使用详解

作者: 奔跑的小蚂蚁_8b28 | 来源:发表于2021-10-13 08:52 被阅读0次

项目开发中经常会用到页面之间传值的问题,常用的方法是通知、单例、代理、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){

<pre style="font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; margin: 0px; padding: 0px; overflow: auto; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-size: 13px; text-align: left;"> `[self dosomething];
   };

解决方案:arc环境下weak,mrc环境下_block;`</pre>

image

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

相关文章

  • iOS 题目详解 部分三

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

  • iOS开发Block使用详解

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

  • iOS Block实例

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

  • iOS开发之获取照片&&TZImagePicke

    iOS开发之获取照片&&TZImagePickerController的使用 iOS 开发之照片框架详解 objc...

  • iOS知识梳理8:万恶的Runtime

    本文中所使用的参考链接:ios开发-Runtime详解ios Runtime几种基本用法简记iOS运行时详解ios...

  • iOS开发---Block详解

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

  • CDUnknownBlockType获取参数的方法

    CDUnknownBlockType 在iOS开发过程中大家都会使用block,可在逆向开发的时候block就显得...

  • iOS开发Block详解

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

  • block 实用小例子

    本篇是简单介绍iOS 开发中block的使用(附demo): /* 声明一个block (返回类型)(^block...

  • iOS开发证书要点详解

    转自 iOS开发证书要点详解,ios证书详解 有细节修改。 首先,假设你使用过Apple设备(iMac/iPad/...

网友评论

    本文标题:iOS开发Block使用详解

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