iOS Block介绍

这篇具有很好参考价值的文章主要介绍了iOS Block介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Block定义

目的就是能够直接存储一个代码块的实现部分,而不需要再去定义一个函数。void (^myblock)() = 可以直接跟实现的代码块,就是将函数整体拿过来,把函数名去掉,在前面加一个block标识^。这样在别的代码块中也可以直接调用这个部分,这就是oc的优化之处。
其实block就是去相当于实现代理,block是委托方声明block方法,并调用,在代理方里面用委托方调用那个block方法,并且实现。block效率更高。

二、block为什么用copy修饰

Block的内存地址显示在栈区,栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,在对block进行copy后,block存放在堆区.所以在使用Block属性时使用Copy修饰,而在ARC模式下,系统也会默认对Block进行copy操作
如果是堆中的block,也就是copy修饰的block。他的生命周期就是随着对象的销毁而结束的。只要对象不销毁,我们就可以调用的到在堆中的block。
这就是为什么我们要用copy来修饰block。因为不用copy修饰的访问外部变量的block,只在他所在的函数被调用的那一瞬间可以使用。之后就消失了。

三、block使用时的注意事项

1、在使用block前需要对block指针做判空处理。
  不判空直接使用,一旦指针为空直接产生崩溃。
2、在MRC的编译环境下,block如果作为成员参数要copy一下将栈上的block拷贝到堆上。
3、在block使用之后要对,block指针做赋空值处理,如果是MRC的编译环境下,要先release掉block对象。

注意:
block作为类对象的成员变量,使用block的人有可能用类对象参与block中的运算而产生循环引用。
将block赋值为空,是解掉循环引用的重要方法。(不能只在dealloc里面做赋空值操作,这样已经产生的循环引用不会被破坏掉)

4、使用方将self或成员变量加入block之前要先将self变为__weak
5、在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。

四、使用 block时什么情况会发生引用循环,如何解决?

一个对象中强引用了block,在block中又强引用了该对象,就会发生循环引用。
解决方法是将该对象使用__weak或者__block修饰符修饰之后再在block中使用。

  1. id __weak weakSelf = self; 或者 __weak __typeof(self)weakSelf = self;. 该方法可以设置宏
  2. id __block weakSelf = self;
    或者将其中一方强制制空 xxx = nil
    检测代码中是否存在循环引用问题,使用Product->Profile->工程的模拟器开始运行->Leaks

五、在block内如何修改block外部变量?

__block int a = 0;
 void (^foo)(void) = ^{
     a = 1;
 };
 foo(); //这里,a的值被修改为1

六、__block与__weak的区别

1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
4.__block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用,__weak只在ARC下使用,可以避免循环引用。文章来源地址https://www.toymoban.com/news/detail-626365.html

到了这里,关于iOS Block介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS——Block签名

    首先来看block结构体对象 Block_layout (等同于clang编译出来的 __Block_byref_a_0 ) 其中 Block_layout 是基础的block结构空间,而部分block则拥有 Block_descriptor_2 和 Block_descriptor_3 结构,其中的 flags 标识记录了一些信息 第1位:释放标记,一般常用BLOCK_NEEDS_FREE做位与操作,一同传入flags,

    2024年02月14日
    浏览(44)
  • iOS-Block

    Blocks的学习 Block根据其类型可以分为三类: 全局Block( NSGlobalBlock ) 栈Block( NSMallocBlock ) 堆Block( NSStackBlock ) 而其区分的规则为: 如果没有引用局部变量,或者只引用了静态变量和全局变量,则为全局Block,如果内部有使用局部变量,如果有被强指针引用过,就是堆Blo

    2024年02月16日
    浏览(38)
  • iOS block以及变量捕获

    Block是什么 Block也是一个OC对象,内部也有isa指针。 扩展: instance对象的isa指向class对象 class对象的isa指向meta-class对象 meta-class对象的isa指向基类的meta-class对象 Block的类型 __NSGlobalBlock__(_NSConcreteGlobalBlock)(存放在数据区) (不访问auto变量的block 即便是访问了static局部变量 或者全

    2024年01月17日
    浏览(39)
  • IOS开发-XCode14介绍与入门

    iOS开发工具一直有个毛病,就是新版本的开发工具的总会有一些奇奇怪怪的bug。比如在我的Mac-Pro(2.3 GHz 八核Intel Core i9)中iOS stimulator就无法使用(MyMac是可用的)。但是真机就可以正常使用。也不知道是XCODE14是只对本家M系芯片的优化导致Intel用不了还是咋的,很是苦恼。

    2024年02月13日
    浏览(46)
  • 移动应用开发介绍及iOS方向学习路线(HUT移动组版)

    ​ 作为一个HUT移动组待了一坤年(两年半)多的老人,在这里为还在考虑进哪个组的萌新们以及将来进组的新朋友提供一份关于移动应用开发介绍以及学习路线的白话文,因为我是iOS方向的,所以学习路线就只介绍iOS了,希望这篇文章对你了解移动应用开发有帮助。 ​ 从字

    2024年02月04日
    浏览(44)
  • 利用scrapy框架对etherscan.io中给定Block范围内的交易信息的爬取

    一、 背景介绍 Etherscan 是 2015 年推出的一个以太坊区块探索和分析的分布式智能合同平台, 由于区块链中的交易信息等数据都是公开透明的 , 而 Etherscan 作为探索以太坊的窗口, 用户可以使用其查看自己的交易详情以及以太坊中的任何信息。 我们都有过这样的经历, 打开 taoba

    2024年02月12日
    浏览(50)
  • 鸿蒙开发|鸿蒙系统的介绍(为什么要学习鸿蒙开发|鸿蒙系统的官方定义|鸿蒙和安卓、ios的对比)

    鸿蒙开发学习是一项探索性的工作,旨在开发一个全场景分布式操作系统,覆盖所有设备,让消费者能够更方便、更直观地使用各种设备。 鸿蒙系统定位为面向未来、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。它通过分布式技术,将各种

    2024年01月15日
    浏览(41)
  • iOS问题记录 - type argument ‘nw_proxy_config_t‘ is neither an Objective-C object nor a block type

    升级Xcode 15后,意料之中,项目又遇到了问题。 Xcode: 15.0 CocoaPods: 1.12.1 flutter_inappwebview: 6.0.0-beta.24+1 Flutter项目在Xcode 15上编译时报错: 从报错信息看,是因为 nw_proxy_config_t 的类型不对导致的,错误发生在 flutter_inappwebview 库用到的 WebKit.framework 中,初步猜测可能是有什么新的

    2024年02月08日
    浏览(45)
  • iOS开发进阶(二):走近iOS原生开发

    在应用 uni-app 进行跨平台APP开发过程中,发现并不支持视频播放小窗功能,且插件市场提供的插件用户体验不好,遂决定自行开发 uni-app 原生插件。 uni-app 原生插件指的是将原生开发的功能按照规范封装成插件包,然后即可在 uni-app 前端项目中通过 js 调用开发的原生能力。

    2024年02月12日
    浏览(37)
  • IO流 详细介绍

    1.IO:输入(Input读取数据)/输出(Output写数据) 2.流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输,IO流就是用来处理设备间数据传输问题的。 3.常见的应用:文件上传、下载、复制等。 文件通常是由一连串的字节或字符构成

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包