block应用与保留环

Intel Edison串行通信扩展实战:UART Block硬件解析与工业应用 串行通信(UART)是嵌入式系统与外部设备进行数据交换的基础接口,其工作原理基于异步串行传输协议,通过TX(发送)和RX(接收)线在设备间传递数据。在物联网和工业控制领域,UART因其简单可靠、协议开销低而成为连接传感器、控制器和传统设备的首选方案。然而,现代高性能嵌入式平台(如Intel Edison)通常采用3.3V TTL电平,而工业环境中大量设备仍使用±12V的RS-232标准,存在电平不匹配和电气隔离需求。SparkFun UART Block作为专为Edison设计的扩展模块,集成了MAX323 阅读详情
block应用与保留环
     block实际是oc的一种语法,EM demo中是习惯使用delegate方法完成异步回调,但由于block语法的使用的更加灵活与代码的可阅读性更好,因此lms部分的代码大量使用了block,但block的使用不好也容易引起较多问题,这里主要阐述循环引用与在viewControl中的code refactory上的优化作用。

循环引用的问题

iOS引用计数机制
     


     上图就是iOS中决定对象生命周期的引用计数(reference counting)的原理,即是只有对象被另外的对象强引用,那么该对象就不应该被释放,当然被释放了的对象也不能再向其发送消息,否则会发生野指针错误。

强引用与弱引用
     oc中的指针有两种类型,一种是强指针用__strong声明,另一种是弱指针用__weak声明。当然地,强指针对应强应用,而强应用的指针只要持有对象,对象就不会被释放。弱指针对应弱应用,弱应用就是所指的对象若被释放了,指针会置为nil,nil可以接收消息但不会响应,因此不会让程序奔溃。

引用block容易造成保留环
- (void)viewDidLoad {
    [superviewDidLoad];
   dispatch_async(dispatch_get_global_queue(0,0), ^{
        NSString *str = self.NSString.
        NSLog(@“%@“,str);
    });
}
以上代码是定义在self类的对象中的,而block块中也调用了了self,因此self对象与block块的引用关系如下图。

在没有手动干预的情况下,两个对象的指针都是强指针,所以都无法释放,形成保留环,造成内存泄漏。而java还有垃圾回收机制,因此对这些保留环会定时情况,而oc只能靠开发人员多加注意了,但oc的内容重用的效率是比较高的,也因为没有垃圾回收机制,因此不会每隔一段时间需要消耗额外的资源去执行垃圾回收机制。关于block的保留环,就需要用过弱指针与强指针的搭配的解决。

强指针与弱指针搭配使用解决block模块引用的两个问题
 - (void)viewDidLoad {
      [superviewDidLoad];
      __weaktypeof(self) weakSelf = self;                     //问题一:通过定义弱指针,解决保留环的问题
      dispatch_async(dispatch_get_global_queue(0,0), ^{
           __strongtypeof(self) strongSelf = weakSelf;        //问题二:通过定义强指针,解决在block调用完之前,self被释放掉了,从而block的所有调用均无效
           NSLog(@"%@",strongSelf.string);
      });
 }


     以上代码所描述的对象之间的指向关系如上图,从因为weakSelf是弱引用,所以并不持有self,weakSelf不影响self的生命周期,仅仅具备调用self的权限,而当self被释放后,又自动置为nil,从而确保不会发生野指针错误。
     至此,又容易引发另外的一个问题,当没有别的对象指向self后,self会执行dealloc method,进行释放。容易造成block还未执行完,便无法发送消息到self进行处理,甚至自身也被释放掉。
     因此需要在block中定义一个strongSelf指向weakS,从而指向self,因为block中的变量指向了self,那么self就不能在block没被释放的情况下释放了,保证了block中的内容能被正确执行。
     到这里,可能会有这样的疑问:为什么不直接用一个strongSelf解决所有的问题,反正最终都要强引用。假若把强引用变量strongSelf定义在block外面,因为block不持有对象,因此无法干预self的生命周期。若把强引用变量strongSelf定义在block内部,因为需要指向self,那么就会直接在block中引入self,造成保留环而发生内存泄漏。
华硕ROG枪神双系统实战:Ubuntu安装避坑指南 本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。 阅读详情

相关推荐

别再乱刷了!《另一个伊甸》异节、改典、典录获取途径完全梳理,这些隐藏奖励你拿全了吗?

本文全面解析《另一个伊甸》中异节、改典、典录的获取途径,包括断章、外传、精灵试炼等高概率掉落副本,以及隐藏任务、限时活动和特殊挑战。提供高效收集策略和优先级建议,帮助玩家快速获取这些稀缺资源,实现角色真证和上限突破。

weixin_42699679的博客 590

IOS内存管理3&之保留环&弱引用&属性保存

IOS的闭环链接和属性的内存管理      IOS过程中我们常常会遇到环链接:就是有A,B两个类。我们在A类和B类互相引用,是的程序可以正常运行。但是在整个程序的过程中两者之间都不能释放,从而造成内存泄露。 @implementation temp{     id _thing; } -(void) setThing: (id)what{     self->_

u013839963的博客 490

电源完整性之仿真设计原理

电源完整性(Power Integrity),简称为PI,也就是大家平常听说的PI。PCB板上的电源设计也是非常重要的,不当的设计也会引起很重要的影响。所以电源完整性PI和信号完整性SI,是我们互连设计人员应该同等重视的问题。今天整理本人接触的电源完整性PI的一些原理,从不的角度去看PI,会有不同的理解,下面开始喽!!! 提到互连的电源设计,可能首先想到的电源分配网络(Power Distribution Nets),因为互连电源会有许多种,直流DC和交流AC,还有不同的电压调节模块(VRM)与不同的负载端

刘小同学的博客 7374

ios NSTimer与保留环

创建NSTimer有下面三中方式 A timer object can be registered in only one run loop at a time, although it can be added to multiple run loop modes within that run loop. There are three ways to create a timer:

li198847的博客 780

Python解析骑行fit文件:从数据缺失到完整记录

本文详细介绍了如何利用Python解析和处理骑行FIT文件,解决数据缺失问题。通过使用fitparse库读取二进制FIT文件,并结合Garmin FitCSVTool进行格式转换,指导读者一步步诊断数据完整性、设计心率修补方案,并最终生成完整的骑行记录文件。该方法为骑行爱好者提供了灵活的数据修复与自定义分析能力。

weixin_29062255的博客 456

Centos7.9上安装glibc2.28遇到/usr/bin/ld: cannot find -lnss_test2问题

Centos7.9安装glic2.28遇到-lnss_test2问题及解决方案。

freflying1119的博客 2898

ARC下用Block解决NSTimer"保留环"的问题

解决的方法是在NSTimer 的基础上,建一个分类(Category)

Charles Leo's Blog 2007

从零到一:Firefly-RK3399上的Ubuntu镜像构建与GPU加速实战

本文详细介绍了在Firefly-RK3399开发板上从零构建深度优化的Ubuntu系统镜像的全过程,包括交叉编译环境配置、内核定制、GPU加速环境部署(Mesa Panfrost驱动、OpenCL/Vulkan支持)以及深度学习推理优化(TFLite + LinuxNN)。通过实战案例展示了如何充分发挥Mali-T860 GPU的硬件潜力,提升边缘AI应用的性能和能效。

pz8901234的博客 1019

【Effective_Objective-C_6 块block】

本章的内容是比较麻烦复杂的一章,牵扯到了GCD和Block,在之前也有学习过,本章作以深入的了解多线程问题是开发应用程序的时候最让人头疼的问题,尤其是线程阻塞,在更新了Mac之后我经常的遇到了彩虹小球的问题,当然在开发的时候还没有出现过线程阻塞问题。Apple以块和大中枢派发设计了全新的多线程,也就是block和GCD。这是两种不同的技术,但都是一并引入的。块:这个机制方便我们把代码像对象一样传递,令其在不同的环境下运行,而且在定义块的范围内可以访问其中的全部变量。

weixin_61639290的博客 1718

Spacedesk保姆级教程:用旧平板给Windows电脑当副屏,从安装到避坑一步到位

本文提供Spacedesk保姆级教程,教你如何将旧平板变成Windows电脑的副屏,从软件安装到网络配置、显示优化及声音交互,一步步避开常见陷阱。通过WiFi实现扩展屏功能,支持4K分辨率和60Hz刷新率,让闲置设备焕发新生。

weixin_42524945的博客 1万+

Android TV 遥控器全链路按键适配指南:从物理按键到应用响应

本文深入探讨了Android TV遥控器按键适配方案,涵盖红外和蓝牙遥控器的工作原理及完整适配流程。红外遥控部分详细介绍了从硬件调试、驱动适配到键值映射配置的方法,并提供了实用的调试命令。蓝牙遥控器部分解析了HID协议和报告描述符,给出内核层与Android层的适配代码示例。文章还介绍了游戏手柄、语音遥控器等特殊外设的适配技巧,并提供了系统级调试工具和内核级调试方法,为开发者提供了一套完整的Android TV输入设备适配解决方案。

学无止境 1266

【Effective Objective - C】—— block 块

本章的内容是比较麻烦复杂的一章,牵扯到了GCD和Block,在之前也有学习过,本章作以深入的了解。多线程问题是开发应用程序的时候最让人头疼的问题,尤其是线程阻塞,在更新了Mac之后我经常的遇到了彩虹小球的问题,当然在开发的时候还没有出现过线程阻塞问题。

qq_72437394的博客 1454

极智AI | 算能SC5+智算卡驱动安装与升级

大家好,我是极智视界,本文介绍一下 算能SC5+智算卡驱动安装与升级

极智视界 1277

[编写高质量iOS代码的52个有效方法](九)块(block)

[编写高质量iOS代码的52个有效方法](九)块(block)参考书籍:《Effective Objective-C 2.0》 【英】 Matt Galloway先睹为快37.理解块这一概念38.为常用的块类型创建typedef39.用handler块降低代码的分散程度40.用块引用其所属对象时不要出现保留环目录编写高质量iOS代码的52个有效方法九块block 先睹为快 目录 第37条理解块这一概

究极死胖兽的博客 981

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

编写高质量iOS代码(六)

1.理解 Block 的概念 a.块 block是 c c++ oc的闭包词法 b.块 可接受参数,也可返回值 c.块 可以分配在堆或栈上,也可以是全局的。分配在栈上的 可以拷贝到堆里面,这样就和oc对象一样了,具备引用计数 2.为常用的块类型创建typeof a.以typeof重新定义块,可令块变量用起来更加简单 b.定义新类型时应遵从现有命名规则 3.用handler块降低代码分散

shixiaoda的专栏 527

VC中sqlite的使用

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

实例方法可直接调用超类的实例方法_Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法下...

第5章 内存管理在Objective-C这种面向对象语言里,内存管理是个重要概念。要想用一门语言写出内存使用效率高而且又没有bug的代码,就得掌握其内存管理模型的种种细节。一旦理解了这些规则,你就会发现,其实Objective-C的内存管理没那么复杂,而且有了“自动引用计数”(Automatic Reference Counting,ARC)之后,就变得更为简单了。ARC几乎把所有内存管理事宜都交...

weixin_39878855的博客 647

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》---学习笔记(31-40)

第五章 内存管理 29. 理解引用计数

IOSSHAN的博客 346

[Effective Objective] 块与大中枢派发

为了解决多线程问题,苹果公司以全新的方式设计了多线程。核心就是“块”(block)与“大中枢派发”(Grand Central Dispatch, GCD)。“块”是一种可在C、C++及Objective-C代码中使用的“词法闭包”,借由此机制,开发者可将代码向对象一样传递,令其在不同环境下运行。GCD是一种与块有关的技术,它提供了对线程的抽象,这种抽象则基于“派发队列”。开发者可将块排入队列中,由GCD负责所有调度事宜。GCD会根据系统资源情况,创建、复用、摧毁后台线程,以便处理每个队列。

m0_63852285的博客 610

[OC学习笔记]块与大中枢开发

当前在开发应用程序时,每位程序员都应留意多线程问题。当前多线程编程的核心就是“块”与“大中枢派发”

weixin_52192405的博客 757

Block与GCD

“块”的概念 块的基础知识 块与函数类似,区别为它直接被定义在另一个函数里,和定义它的那个函数共享同一个范围的内容。块用“^”符号来表示,后边跟着一对花括号,括号里面是块的实现代码。 ^{ //Block } 块的本质是一个值,而且有其相关类型。与int、float或OC对象一样,也可以把块赋值给变量,然后像使用其他变量那样使用它。块的语法与函数指针近似: //块的语法结构 return_type (^block_name)(parameters) //块的简单使用方法 //定义块 int

LANGJ1的博客 1607

block的使用

一、block(块)的定义 block是一种类型,封装了一段代码块,可以在任何时候执行,block也可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。block与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同一个范围内的东西。block用“^”符号来表示

爱家人,爱老婆,爱生活,爱coding,爱运动的有爱青年 841

block才会执行 mono_浅析Block闭包

浅析Block闭包 简单来说,block就是将函数及其上下文封装起来的对象,从功能上可以把它看作是C++中的匿名函数,也可称之为块。Block类型写法:返回值+(^块名)+(参数)= ^(参数){ 内容 }如下所示:int (^myBlock)(int a, int b) = ^(int a, int b){ return a + b; };Block结构Block存储区域Block本质...

weixin_28752415的博客 517

Block在iOS编程里的应用

一,明确两点1,Block可以访问Block函数以及语法作用域以内的外部变量。也就是说:一个函数里定义了个block,这个block可以访问该函数的内部变量(当然还包括静态,全局变量)——即block可以使用和本身定义范围相同的变量。 2,Block其实是特殊的Objective-C对象,可以使用copy,release等来管理内存,但和一般的NSObject的管理方式有些不同,稍后会说明。二,

zhuxincheng_1218的专栏 481

Form中Block的重新查询

Form中某些按钮可能调用了Package对表中某些字段进行更新,但是数据库中字段的修改不会马上反映到form的界面上,所以要进行重新查询,但是用户可能使用了查询窗口进行查询之后然后再点击按钮动作,如果简单的使用execute_query进行查询的话那么就会把原来的查询条件冲掉。所以这里写了一个公用的包进行查询: procedure query_block(p_block_name varcha

记录成长过程中的点滴 1241

理解Block

Block简称闭包,实际上就是一个程序块,Block的名称类似于函数的入口地址,有自己的作用域范围,在作用域结束接受后被销毁(通常函数结束后),通常被分配在栈中(以便访问局部变量和提高性能),Block本身是一个objective-c 中的对象,适用于内存管理方法,我们可以使用Block来完成一些同步执行的程序片段,封装一些小型的工作和完成一项工作时的回调(callback)。Blocks 作为

pingchangtan367的专栏 1021

inode 与 block 概念详解

inode 与 block 是 Linux 文件系统的基石,理解它们可以更好地掌握文件的存储方式、操作效率、系统限制与潜在风险。通过合理配置与调优,可提升系统的稳定性与性能。

x² 1174
上一篇: 加密算法学习以及base64加密解密应用
下一篇: iOS html标签解析解决方案
luozhiwei_iOS
博客等级 码龄12年 4粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值