ARC和MRC下Block的使用注意

ios 面试题之—block 对block的综合理解 block的实质 对象, 一个函数指针, 指向代码块, 以及上下文所需的变量 函数指针和block的格式对比 函数指针 void(*fun)(int) block void(^fun)(int) block在内存中的分类 全局block –> GlobalBlock <==> 相当于全局变量, 系统会自动释放 栈block –> St... 阅读详情

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

  在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上的几种情况?

  • 1.block作为函数返回值时
  • 2.将block赋值给__strong指针时
  • 3.block作为Cocoa API中方法名含有usingBlock的方法参数时
  • 4.block作为GCD API的方法参数时

 如果是MRC(手动)在栈区 NSStackBlock 

11.block属性为什么要使用copy?

定义里一个block属性为taskint 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类型

NSGlobalBlock是位于全局区的block,它是设置在程序的数据区域(.data区)中。

NSStackBlock是位于栈区,超出变量作用域,栈上的Block以及  __block变量都被销毁。

NSMallocBlock是位于堆区,在变量作用域结束时不受影响。

__block修饰符

1.在block的内部,访问外部的变量时,block内部会对外部的变量进行一次拷贝,在block内部操作的是拷贝之后的副本,不会影响外部的变量,这个变量在堆区

2.在block内部,修改外部变量,是不被允许的

3.如果非要在block内部修改外部的变量,需要使用__block修饰外部变量

4.一旦外部的int变量(在栈区)被__block标记了,如果block内部又修改了这个变量,那么这个变量的地址会永久的被修改在堆区 

如果外部变量是NSMutableString这样本身就在堆区的,在block内部修改就不会报错 

5.为什么在block的内部不能修改外部的变量? 

因为block一般是需要传递给另外一个类里面,block内部的一些变量不能存储在栈区,需要存在堆区,不然数据就容易丢失,这就是使用__block修饰的原因,这样传输数据的时候,数据就不会丢失


 

IBM System x3650 M5 IMM配置 1、IMM基本介绍 IMM,全称是Intel Mobile Module是IBM服务器上的集成管理模块,该模块是独立于服务器系统,可以通过一个单独的IP地址,使用Web和虚拟端口方式直接启动、停止和管理远程服务器,即使主板、处理器或者内存故障导致主机无法启动,也依然可以远程管理服务器,可以远程直接操作启动画面和服务器工作界面。 2、IP地址配置 2.1 通过Web方式修改IP地址 IBM服... 阅读详情

相关推荐

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通过在每个连杆上建立坐标系,并利用齐次坐标变换来实现连杆之间的坐标转换。通过依次变换,可以推导出末端执行器相对于基坐标系的位姿,从而建立机器人的运动学方程。以IRB4600型六自由度工业机械臂为例,选择标准DH建模方法,建立其正运动学模型。

chen_mp的博客 1万+

MRC下安全的Block

iOS4以后引入的block,一个比较方便且实用的功能。但是自己在开发的时候遇到了不少的坑,很多都是和内存管理相关的,后来iOS5.0以后有了ARC,有了__weak关键字,所以block使用也就更安全了。   但是,吐槽下我们公司。对于像我们公司这种,还在支持iOS4.3,还在用MRC的来说,很多后来方便的框架和工具都不能用了。而那个坑还是那个坑。   最近在看C++的东西,无意中又想起了这

程序人生 5969

二相混合式步进电机闭环矢量控制simulink仿真(含仿真文件)

在位置跟踪伺服系统中二相混合式步进电机闭环矢量控制simulink仿真

qq_39023633的博客 2万+

iOS: ARC和非ARC下使用Block属性的问题

目录 1. Block的声明和调用 2. 循环引用问题   返回目录 1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block)。 另一个需要注意的问题是关于线程安全,在声明Block属性时需要确

long458的专栏 1万+

电信光猫隐藏的VOIP功能揭秘:不用座机也能打电话(EasySip实战)

本文揭秘了电信光猫隐藏的VOIP功能,通过EasySip实战演示如何无需座机实现高清通话。详细解析了光猫的SIP协议支持、语音VLAN配置及网络架构优化,帮助用户利用现有设备提升通话质量并扩展设备兼容性,特别适合智能家居和企业级应用场景。

weixin_29268385的博客 755

检索生成(RAG) vs 长文本大模型:实际应用中如何选择?

大模型的上下文理解能力直接影响到 LLMs 在复杂任务和长对话中的表现。本期内容聚焦于两种主流技术:长上下文(Large Context Windows)和检索增强生成(RAG)。这两种技术各有何优势?在实际应用中,我们又该如何权衡选择?文章不仅详细阐述了这两种技术的工作原理,还深入分析了它们在效率、准确性和实施成本等方面的差异。文章特别提到了在执行重复性任务时使用 Context Caching 优化长上下文的优势,然而,缓存策略的效果很大程度上取决于提示词的可预测性。

2401_85782938的博客 1254

MRC 下block 小结

当block 作为属性时候,需: 1:属性设置应为copy,将此block copy至堆内存上(block在栈上被实现,出了作用域则被出栈),保证其生命周期不被提前结束。 2:使用外部变量、不产生循环,添加__block修饰符修饰。 3:在vc.block = ^(){}时发生属性的copy行为赋值,参见点语法copy的setter方法.(转)http://www.cnblogs.com/d...

weixin_30786657的博客 207

逆变器方案(工频全套)工频正弦波逆变器开发板全套设计资

逆变器方案(工频全套)工频正弦波逆变器开发板,24V-72V通用12只TO-247封装MOS管,额定输出功率6500W以下;配有触摸屏操作界面,运行数据一目了然,带市电互补UPS功能,可选择电池优先或市电有限工作,我们的开发板均从实战角度出发,让您的学习更便捷,包含全套设计资料,PCB.原理图.源代码,程序均有中文注释,MCU选用美国微芯公的PIC-8位单片机,民用数字电源首选单片机,抗干扰能力强,运行稳定。...

m0_73494033的博客 892

博弈论

博弈论 摘自https://blog.youkuaiyun.com/lgdblue/article/details/15809893 一、巴什博弈 1、问题模型:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜。 2、解决思路:当n=m+1时,由于一次最多只能取m个,所以无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜,所以当一...

mrcrack的博客 2570

智能座舱测试工程师必看:从零搭建自动化测试框架的5个实战技巧

本文为智能座舱测试工程师提供从零搭建自动化测试框架的5个实战技巧,涵盖环境搭建、ADB高级应用、Python脚本工程化、Monkey测试优化及性能调优。通过ADB深度操作和Python脚本封装,帮助测试人员构建高可复用的智能座舱测试解决方案,显著提升测试效率与问题发现率。

python9snake的博客 633

ARM学习 | 紧耦合存储器 (TCM)

TCM 是一种专用的片上存储器,直接与处理器核心耦合。确定性访问:由于不涉及缓存替换或一致性管理,访问延迟固定。高带宽:TCM 通常通过专用总线连接处理器核心,可以提供更高的数据吞吐率。用户管理:TCM 的分配和管理完全由开发者控制,不依赖硬件缓存策略。ARM 处理器中的 TCM 通常分为ITCM(指令紧耦合存储器)和DTCM(数据紧耦合存储器),分别用于存储指令和数据。TCM 是 ARM 处理器中不可忽视的重要特性,在实时系统和高性能嵌入式应用中具有重要地位。

qq_43167806的博客 3329

关于block的循环引用,你看我就够了!

开篇: 如果你之前看过我block的其他的文章,你会更容易今天这篇博客的一些更深的解释,每篇只有一个知识点,基本上把这些都看了,block基本不会有什么问题的,基本都是掌握了. block的源码解读之变量捕获机制(capture) 从源码、ARC、MRC带你理解block的三大类型 深入理解block的底层之copy 深入理解block的底层之对象类型的auto变量 深入理解__block修饰符的底层实现原理 循环引用: 在平时开发过程中,block是我们经常使用的功能,如果不多加注意就会造

Lucky_Deng的博客 1919

【EB_Tresos专题】-01-EB Tresos导入工程

<--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> 结尾 ...

「汽车电子助手」的博客 6433

深入理解IOS Block

对block的综合理解 block的实质 对象, 一个函数指针, 指向代码块, 以及上下文所需的变量 函数指针和block的格式对比 函数指针 void(*fun)(int) block void(^fun)(int) block在内存中的分类 全局block --&gt; GlobalBlock &lt;==&gt; 相当于全局变量, 系统会自动释放 ...

我的专栏 433

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

iOS Block原理和内存中位置

Posted by 微博@iOS音视频原创文章,自由转载-非商用-非衍生-保持署名 简介 今天回顾一下blcok,基本用法在我的这篇文章中有较为详细的描述,这次不再回顾,本次 block的原理和内存中的位置 是主角。 如何理解blcok block:可以理解为匿名的函数,就是预先准备好的一段代码,在需要的时候调用。 底层实现 block是一个指针结构体,在终端

sharpyl的专栏 1232

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS面试题与核心基础之block

block本质,block变量捕获,block循环引用

Elevason 419

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

iOS block回调

复习下 block回调:

Run of the fish 649

iOS知识----block简单知识

Block简介 Block是一种比较特殊的数据类型。它可以保存一段代码,在合适的时候取出来调用。 Block的修饰 ARC情况下 1.如果用copy修饰Block,该Block就会存储在堆空间。则会对Block的内部对象进行强引用,导致循环引用。内存无法释放。 解决方法: 新建一个指针(__weak typeof(Target) weakTarget = Target )指向Blo

风眠的博客 295

XB_block(3)

1.__block的内存管理 我们已经知道,__block修饰符会把auto变量包装成一个对象 1.当block在栈上时,并不会对__block变量产生强引用 2.当block被copy到堆时,会调用block内部的copy函数,copy函数内部会调用_Block_object_assign函数, _Block_object_assign函数会对__block变量形成强引用(retain),...

HuberCui的博客 351

黑马程序员---成长之路-----OC之基础篇ARC和类别

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流 autorlease注意及错误用法 autorelease的作用:把对象加入到自动释放池中,延迟对象的释放 使用注意: int main(){ Person *p=[Person new]; //自动释放池 @autoreleasepool{ //1、并不是所有的放到自动释放池中的代码,产生的对象就会自

qq_31783131的博客 430

内存管理的一些小问题(面试常用)

1.多人开发如何检查内存泄漏? > 使用Analyze进行代码的静态分析; > 尽量在ARC环境下进行多人开发。 2.MRC环境下怎么做单例模式? 基本步骤: >声明一个单例对象的静态实例并初始化为nil; >创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例; >实现NSCopying协议,覆盖allocWithZone:方法,确保用户在直接分配和初始

成小成---未来在脚下 513

ios Block底层详解、框架结构:捕获、对象类型、__block、__forwarding、循环引用

1:捕获 2:block类型 2.1:问题 :mrc环境下 下面讲的都是mrc环境下,会真实很多 2.2:在arc下,block 自动加上copy的情况---:返回block。 2.3:在arc下,block 自动加上copy的情况---:强指针__block; 2.4:arc环境下:方法名中有usingBlock的方法参数时,也会进行copy操作。 2.5:在arc下,block ...

qq_27909209的博客 3176

Objc Block

ref1 一、__block 的使用   说明:     在 block 内只能读取在同一个作用域的变数而且没有办法修改在 block 外定义的任何变数,此时若我们想要这些变数能够在 block 中被修改,就必须在前面加上 __block 的修饰词,否则编辑时就会产生错误。     在编译的时候,同一作用域的变量的值会被 copy 下来,即使在接下的语句中修改变量的值,也不会对 block...

weixin_33853827的博客 128

block的循环引用问题2(block为什么用copy修饰)及处理循环引用

Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 另外需要注意线程安全问题,在调用block时另一个线程有没有可能去修改block如果有, 那就用nomatomic 比如这样一个Block类型:typedef void (^MyBlockType)(int);属性声明:@property (copy) MyBloc...

weixin_30572613的博客 134

OC知识点大全(笔记)

·成员变量与属性的区别:声明了@property并@synthesize后编译器会为实例变量生成getter和setter方法,成员变量用来存储属性的值 //NSObject 属性Foundation框架下的一个类 //iOS 中的四个基本框架:Foundation、SystemConfiguration、UIKit、CFNetWork //对象的生命周期:对象的生命周期从 alloc 开始,

冰凉的枷锁的博客 1455

iOS易引起内存泄漏原因总结

最近通过Analyze及Leaks等工具对项目进行了内存泄漏问题的检测及修改,现对遇到的易造成内存泄漏的问题进行一些总结,每点中都列举了会造成内存泄漏的代码书写方式,并对其原因进行分析,最后给出了相关的解决方案。 接下来就开始进行总结: 一、 循环引用 循环引用是在iOS可能引起内存泄漏的主要原因,这类问题常见的出现在Block的使用中,由于Block会持有所使用到的变量,下面就总结下Block使...

TuGeLe的博客 2034
上一篇: iOS Strong和Copy 理解
下一篇: Block本质
LIN1986LIN
博客等级 码龄19年 17粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值