ARC和MRC下Block的使用注意

2023-12-19 12:58
文章标签 使用 block 注意 arc mrc

本文主要是介绍ARC和MRC下Block的使用注意,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Block

  • 1.是一段代码块,只在被调用的时候执行(类似于方法和函数)
  • 2.是一种数据类型(类似于’int’,’NSString’)
  • 3.可以定义成临时变量
  • 4.可以当做参数传递
  • 5.可以定义成属性
  • 6.是一种匿名函数(重要,只有函数体,没有函数名)
  • 7.是一个指向函数的指针(一个指针对象,block的名字就是指针的地址)
  • 8.因为block代码块的内部没有修改和访问外部的变量,所以函数体不会发生变化,就像NSString一样,定义的变量都保存在常量区,不会随着定义的数量而增大空间的开辟,所以定义多个相同的代码块也一样,都会保存在常量区,前提是定义的代码块内部不发生改变
  • 9.只要代码块的函数体不发生变化,无论是ARC还是MRC它的存储区域是一样的,都是常量区
  • 10.当代码块函数体发生变化的时候,例如访问或者修改外部变量

    int num = 10;
    void(^block)() = ^{
    NSLog(@"%d",num);
    };
    NSLog(@"%d",block);
    • 如果是ARC(自动)在堆区 NSMallocBlock
    • 如果是MRC(手动)在栈区 NSStackBlock
  • 11.block属性为什么要使用copy?

    定义里一个block属性为task
    int num = 10;
    void(^block)() = ^{
    NSLog(@"%d",num);
    };
    self.task = block;
    NSLog(@"%@--%@",block,self.task);//栈区,堆区
    • MRC环境下,在定义block为属性时,使用copy的原因,是把block从栈区拷贝到堆区,因为栈区中的变量出了作用域之后就会被销毁,无法在全局使用,所以应该把栈区的属性拷贝到堆区中全局共享,这样就不会被销毁了,在MRC手动管理的就是堆区,不需要系统管理,MRC环境必须使用copy把变量拷贝到全局的堆区
    • 如果是ARC的环境下,就可以不使用copy修饰,因为ARC下的属性本来就在堆区
    • 很早的时候MRC的block属性都是在栈区的,copy之后就到堆区了
    • 当前的ARC的block属性默认都在堆区,使用copy知识沿袭了历史的习惯,使用strong也是没有问题的
    • 12.在MRC下必须使用self.task = block;给属性赋值,在赋值的时候会调用setter方法,会把栈区的block拷贝到堆区,如果使用_task的方式赋值不会去copy,所以在MRC下属性都用copy修饰
    • 13.在ARC下可以使用_task,因为arc下默认属性就是在堆区

__block修饰符

  • 1.在block的内部,访问外部的变量时,block内部会对外部的变量进行一次拷贝,在block内部操作的是拷贝之后的副本,不会影响外部的变量,这个变量在堆区
  • 2.在block内部,修改外部变量,是不被允许的
  • 3.如果非要在block内部修改外部的变量,需要使用__block修饰外部变量
  • 4.一旦外部的int变量(在栈区)被__block标记了,如果block内部又修改了这个变量,那么这个变量的地址会永久的被修改在堆区
    • 4.1 如果外部变量是NSMutableString这样本身就在堆区的,在block内部修改就不会报错
  • 5.为什么在block的内部不能修改外部的变量?
    • 5.1 因为block一般是需要传递给另外一个类里面,block内部的一些变量不能存储在栈区,需要存在堆区,不然数据就容易丢失,这就是使用__block修饰的原因,这样传输数据的时候,数据就不会丢失

block循环引用

  • 1.有可能造成block的循环引用,有个非常明显的特征:在block内部访问了self.成员变量也是强引用,比如在block中打印成员变量
  • 2.解决办法就是使用:__weak,修饰self的目的是告诉block在引用self的时候,不要强引用/不要把引用计数+1
  • 3.block内部对外部变量进行拷贝的时候,会对外部的变量引用计数+1
    将NSLog中的self替换成weakSelf的时候,使用__weak修饰的不会增加引用计数,作用是告诉block你在拷贝self的时候,不要对它的引用计数+1

    __weak typeof(self) weakSelf = self;
    void(^block)() = ^{
    NSLog(@"%d",self);
    };
  • 4.注意:block内部访问一个全局的属性的时候,一定要使用self.;千万不要在block内部使用成员变量

这篇关于ARC和MRC下Block的使用注意的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/512246

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti