再谈内存管理与ARC运行机制——内存管理

压电陶瓷传感器避坑指南:实测阻抗匹配对信号输出的影响(附示波器调试技巧) 本文深入探讨压电陶瓷传感器在工业振动监测中的阻抗匹配问题,通过等效电路模型和实测数据揭示负载阻抗对信号输出的关键影响。文章提供从元件选型到示波器调试的完整解决方案,特别强调100kΩ以上负载阻抗的重要性,并分享JFET缓冲器设计和PCB布局的实用技巧,帮助工程师避免信号失真和输出不稳定问题。 阅读详情

内存管理


内存在Objective-C开发中是一种相对稀缺的资源,拿Iphone4为例,它的内存只有512mb,所以妥善的处理好所创造,所使用的每个对象与变量都将成为一个问题。在ARC出现以前,同大部分基于C的编程语言一样,程序员需要考虑如何高效的管理内存。像在Java或是一些脚本语言中就不需要考虑内存管理的问题。

生命周期




Obj-c对象的创建,存活和销毁整个过程为它的声明周期。销毁后就会回收对象占用的内存。那么跟踪对象的使用,以及理解在什么时候释放资源十分重要。

看到这样一个问题,问为什么不在dealloc中release viewController而是立即释放呢?

MainViewController *viewController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
self.mainViewController = viewController;
[viewController release];

其实理解了持有者的作用就能很快回答,指针viewController在这里只是负责一个MainViewController的创建,以及给mainViewController传值的一个作用,之后它的存在并没有意义了,所以立即release掉来消除引用。

在频繁的增加持有者的时候,可以用retainCount属性来跟踪持有者的个数,当然在一些难以确定的区域,也可以借助autorelease来帮助管理。
内存管理好比于保安开和锁住大门。当人要进入公司工作时,先要打卡声明来工作了,走的时候也打卡说明下班了,当所有人都走了之后,保安才能锁住大门,提前锁或不锁都会出现一些问题。

一般来讲,内存管理遵循一些原则:
1.自己生成的对象,自己持有它(生成并持有的方法一般为:alloc,new,copy,mutableCopy)
2.不是自己生成的对象,自己也能持有
3.不再需要自己持有的对象,立即释放
4.不能释放不是自己持有的对象

内部实现


因为苹果公司不开源的原因,很多研究只能去看GNUstep来说明,GNUstep是Cocoa框架的互换框架。虽然不是完全相同,但从实现来说,应该是十分相近的。

+ alloc方法

alloc方法调用 +allocWithZone:

+ (id)allocWithZone:(NSZone *)z
{
return NSAllocateObject(self, 0, z); //这个方法负责分配内存空间并返回作为对象使用的id类型。
}

那么引用计数呢?

引用计数其实也是保存在一个结构体
struct obj_layout {
NSUInteger retained;
};
alloc类方法用这个结构体来保存引用计数并将其保存在头部,每调用一次alloc,指向结构体的指针给retained + 1。
那么访问retained的方法自然就去访问对象指针的头部
return ((struct obj_layout *) anObject)[-1].retained + 1; //anObject为传入的参数,理解为调用者本身(self)

那么,retain方法就会使上面的retained值自增1,release方法减1。

dealloc时,
struct obj_layout *o = &((struct obj_layout *) anObject)[-1];
free(o);
来废弃该结构体。

在《Objective-c 高级编程》中,作者给出了对苹果实现的猜测。大体思想还是类似的,不过存储方式貌似发生了改变,上面是将引用计数存储在了对象内存块的头部,而苹果实现,将其保存在了引用计数表的记录中。并且各自的好处如下:

头部管理:
少量代码即可完成。
能够统一管理引用计数用的内存块与对象用的内存块。

引用计数表管理:
对象用内存块的分配无需考虑内存块头部。
引用计数表各记录中存有内存块地址,可从各个记录追溯到各对象的内存块。


autorelease


经过autorelease的对象,不需要由我们手动去管理内存,而是由自动释放池(Autoreleasepool)来进行管理。尽管如此,只要不废弃AutoreleasePool对象,那么生成的对象就不能被释放,有时可能会产生内存不足的现象。所以要注意释放池的使用。

来看一下GNUstep对autorelease的实现
- (id)autorelease
{
[NSAutoreleasePool addObject:self];
}
在NSAutoreleasePool中对addObject:方法的实现
- (void)addObject:(id)anObj
{
[array addObject:anObj];
}

再来看下其他方法
- (void)drain
{
[self dealloc];
}

- (void)dealloc
{
[self emptyPool];
[array release];
}

- (void)emptyPool
{
for (id obj in array) {
[obj release];
}
}

那么,如果autorelease NSAutorelease对象会怎么样呢?
答案是肯定的,发生异常:不能自动释放一个自动释放池。

当然,自动释放池可以嵌套使用
@autorelease {
@autorelease {
code...
}
}

以上是本篇文章的全部内容,欢迎指正和讨论。转载注明出处~
全新YOLO26有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进 🔥《2026年YOLO26改进专栏》🔥 🚀持续更新500+最前沿创新改进点(顶会顶刊论文/独家创新策略),涵盖主干网络、各种卷积、注意力机制、检测头等模块,助力科研论文发表与模型性能提升,支持检测/分割/分类任务。订阅即获完整可运行项目,提供专业QQ答疑群,适合科研发论文(SCI/CCF/核心)及工业应用(PCB/医学/遥感检测)。专栏价格将逐步上涨,早订更优惠! ⭐特色:非计算机专业友好、模块可自由组合、全网独家创新;📌适用:研究生大论文和小论文创新、小目标检测、多领域科研应用,满足不同研究需求。 阅读详情

相关推荐

AVM环视:系统搭建整体流程

文章目录前言一、畸变矫正鱼眼相机二、透视变换三、图像拼接四、图像融合总结 前言 由于正在做AVM环视,所以记录一下整个过程,归纳为一个系列文章,并对期间遇到的错误进行归纳整理。本文主要概括了AVM环视的大致流程和逻辑,不涉及代码部分,仅供思路参考,其中涉及的具体技术会在后期整理为小章节进行分析。 一、畸变矫正 鱼眼相机 做环视基本上使用到的是鱼眼照片,因为鱼眼相机的视角范围可以达到220°到230°,所以一个相机就可以采集到一个面的全部信息,例如汽车具有四个面,那么在汽车的前后左右分别安装一个鱼眼相机.

qq_34468890的博客 6536

ARC介绍

ARC也是我想讲的一部分内容,很多iOS的程序员到现在也没有完全转向ARC,当然各有各的理由,这里只是转载了一篇介绍性的文字,简单介绍了ARC,之后还会继续补充转向ARC的实际操作。 写在开头 虽然距离WWDC2011和iOS 5已经快一年时间,但是很多开发者并没有利用新方法来提高自己的水平,这点在ARC的使用上非常明显(特别是国内,基本很少见到同行转向ARC)。...

weixin_34018169的博客 415

Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (一) 环境搭建

搭建的目的只是刚好看到有这么一个模块, 还有给使用Go的人需要用到调试界面的时候用一下,真正开发界面并不建议用,没必要, 还有缺点就是在windows平台下编译偏慢, 还有其他一些UI纯Go开发的UI -

听我一言的博客 1万+

ARC机制-自动引用计数

Automatic Reference Counting,自动引用计数,简称ARC,在ARC机制下,我们不再需要手动调用retain、release、autorelease方法,编译器会自动的在合适的地方插入retain、release、autorelease代码

laya1211的博客 657

Jetson Nano(1)——笔记本电脑控制

笔记本电脑控制Jetson Nano没有显示屏如何控制Jetson Nano一、使用ssh客户端连接到Jetson Nano的命令端1.将电脑的网线口和jetson nano的网线口通过网线连接2.在控制面版中打开“更改配适器设置”3.查找jetson nano的ip地址4.利用putty链接二、远程桌面配置 没有显示屏如何控制Jetson Nano Jetson Nano相当于一个微型电脑,能快...

weixin_43619070的博客 1万+

从RADIUS服务器到AP:实战搭建一个小型WPA2-Enterprise测试环境(FreeRADIUS + 家用路由器)

本文详细介绍了如何从零搭建WPA2-Enterprise测试环境,使用FreeRADIUS服务器和家用路由器实现企业级WiFi认证。通过实战指南,包括证书生成、EAP-PEAP配置、OpenWrt路由器设置及故障排查,帮助网络工程师和爱好者掌握802.1X协议栈的实际应用。

weixin_28715953的博客 325

ARC机制

iPhone开发深入浅出 — ARC    本文摘自“泰然”论坛 一、ARC是什么          ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。 该机能在 iOS 5/ Mac OS X

伍友健的博客 2667

模型剪枝实战 | Torch-Pruning 库在YOLOv8上的应用指南

本文详细介绍了如何使用Torch-Pruning库对YOLOv8模型进行结构化剪枝,以实现模型“瘦身”。通过DepGraph(依赖图)技术自动处理层间依赖,确保剪枝安全。文章提供了从环境搭建、核心原理理解到完整剪枝流程的实战指南,并强调了剪枝后的微调与性能评估,帮助开发者在保持精度的同时显著提升模型推理速度。

weixin_29046035的博客 503

iOS-ARC机制

内存管理是开发软件中重要的一个课题。如果内存管理不当,轻者内存泄露,重者程序崩溃。 下面重要讲述一下iOS的ARC(Automatic Reference Counting))机制。 ARC的历史由来 在iOS1.0的时候,苹果公司没有开放手机开发接口,不存在iOS开发者这个概念。 在iOS2.0的时候,我们管理内存使用的技术数MRC机制。 在iOS5.0的时候,苹果公司推出了ARC机制...

weixin_30781107的博客 216

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

这种方法通过迭代地将一个需要较多步骤的模型(称为教师模型)蒸馏成一个需要较少步骤的学生模型,每次迭代都将采样步骤减半,直到达到所需的采样步骤数量。通过渐进式蒸馏,论文将原始需要8192步采样的模型成功蒸馏为只需4步采样就能取得接近的生成质量的新模型,大幅提高了扩散模型的推理效率。这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。

q742971636的博客 1787

无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程

当您遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息时,请按照上述步骤来解决问题。当您尝试加载文件C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1时,可能会遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息。请注意,更改执行策略可能会带来一些安全风险。

PixelInk的博客 1921

再谈内存管理与ARC运行机制(一)

内存管理 内存在Objective-C开发中是一种相对稀缺的资源,拿Iphone4为例,它的内存只有512mb,所以妥善的处理好所创造,所使用的每个对象与变量都将成为一个问题。在ARC出现以前,同大部分基于C的编程语言一样,程序员需要考虑如何高效的管理内存。像在Java或是一些脚本语言中就不需要考虑内存管理的问题。 生命周期 ...

weixin_30955341的博客 72

使用静态库在嵌入式系统中进行开发

静态库是一种包含预编译对象代码的文件,它可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。静态库是包含预编译对象代码的文件,可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。的静态库文件,可以在嵌入式系统的应用程序中使用它了。

ZrElixir的博客 203

Object-C中的内存管理 MRC、ARC以及Autoreleasepool的区别

总结一下MRC、Autoreleasepool、ARC的区别 内存中存在五大区域,他们分别是堆区、栈区、数据段、BSS段以及代码段。

xgc阳光的博客 1911

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 技术参考手册》。

手把手教你ARC——ARC入门和使用

ARC is supported in Xcode 4.2 for Mac OS X v10.6 and v10.7 (64-bit applications) and for iOS 4 and iOS 5. Weak references are not supported in Mac OS X v10.6 and iOS 4. ARC支持Mac OSX 10.6和10.7的XCode

依然风 | ios 6114

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

手把手教你ARC——iOS/Mac开发ARC入门和使用

Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论。请不要将本文的部分或全部内容用于商用,谢谢合作。 欢迎转载本文,但是转载请注明本文出处:http://www.onevcat.com/2012/06/arc-hand-by-hand/ 本文适合人群:对iOS开发有一定基础,熟悉iOS开发

沐风 1090

WINCC7.3破解文件

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

iOS--ARC相关知识点

本文简单介绍了 MRC、ARC 的区别以及工作原理;强引用造成的循环引用、解决方案以及常见场景;自动释放池以及其数据结构

2301_79929304的博客 774

IOS开发-内存管理详解

在学习完我的文章之后相信你对内存管理和属性修饰符有更加清晰的认识,如果你喜欢我的文章,可以给我点个赞吗,谢谢

qq_52041970的博客 1679

iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论。请不要将本文的部分或全部内容用于商用,谢谢合作。 欢迎转载本文,但是转载请注明本文出处:http://www.onevcat.com/2012/06/arc-hand-by-...

weixin_34362875的博客 106

OC内存管理教程之ARC(二)——自动引用计数规则

前言:        上一篇介绍了Objective-C的内存管理,本篇讲述ARC所引起的变化。        实际上,“引用计数式的内存管理”的本质在ARC中并没有改变。就算开启了ARC,编译器关于对象的内存管理还是会使用引用计数的形式。只不过ARC自动帮我们处理了计数的相关部分,开发者不再需要时刻关心当前计数为几,自己在使用对象的时候有没有及时retain或者release。

sodawaterer的博客 1517

iOS---Object-C之内存管理机制

概述在程序运行过程中需要创建大量的对象,Object-C中对象是存储在堆中的,系统不会自动释放堆中的内存(基本类型数据是由系统自己管理的,放在栈上)。如果一个对象创建后并没有得到及时的释放则就会占用大量的内存。其他高级语言入C#、Java等都是通过垃圾回收(GC)来解决的,但是在OC中并没有类似的垃圾回收机制,因此OC的内存管理需要由开发人员手动处理。1.引用计数器 2.属性参数 3.自动释放池

C_Lluckying的博客 992

IOS内存管理--自动释放池的实现原理

原文链接:http://www.cocoachina.com/ios/20150610/12093.html 内存管理一直是学习 Objective-C 的重点和难点之一,尽管现在已经是 ARC 时代了,但是了解 Objective-C 的内存管理机制仍然是十分必要的。其中,弄清楚 autorelease 的原理更是重中之重,只有理解了 autorelease 的原理,我们才算是真正了解了

peixuan的专栏 1万+

金山办公iOS校招笔试全解析:从内存管理到Runtime与RunLoop

在iOS开发中,内存管理、Runtime与RunLoop是构建稳定应用的核心基石。理解ARC下Block的捕获机制、weak与assign的本质区别,以及消息转发流程,能有效避免循环引用与野指针崩溃。这些原理不仅决定App的运行性能,也直接体现在复杂UI布局、多线程任务和网络请求等工程实践中。对于准备移动端校招的开发者而言,掌握这些基础原理是应对大厂笔试的关键。本文以金山办公iOS开发岗位的笔试题为线索,逐一拆解Objective-C语言基础、运行时机制、UI适配、数据存储与线程安全等高频考点,并结合手写单

weixin_33835461的博客 228

OC重新开始(七)内存管理GC

文章目录内存管理(三)垃圾回收垃圾收集器finalize方法的定义编译须知ARC和GC须知GCARC 内存管理(三) 垃圾回收 垃圾回收是指在程序运行过程中,检查是否有不在使用的对象,并自动释放它们所占用的内存,通常被称为GC(garbage collector)。 垃圾回收的目标是不在使用的实例对象。即通过全局变量、静态变量或者栈内变量的引用而查找的对象都不可以被回收。 垃圾收集器 垃圾收集器的...

link_cout的博客 374

货拉拉iOS笔试真题解析:内存管理、Runtime与多线程核心考点

在iOS开发中,内存管理、Runtime机制与多线程并发是决定应用性能与稳定性的基石。理解ARC底层的引用计数、Block的捕获与循环引用,掌握消息转发与Method Swizzling的原理,能够帮助开发者从根源上规避崩溃与内存泄漏。多线程场景下,正确运用GCD队列、NSOperation依赖关系及各类锁机制,是构建高效响应与数据安全的关键。这些技术能力在面试考察中屡见不鲜,也直接关系到实际工程中弱网优化、界面流畅度与线上问题排查的落地效果。本文结合货拉拉2018秋招iOS工程师笔试题卷二(B),逐题拆解

weixin_29294975的博客 253

object-c(oc)内存管理机制详解

1.内存的创建和释放    让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象: 1 2 3 //“ClassName”是任何你想写的类名,比如NSString  NSArray等一切随意 id testObject = [[ClassName alloc] init

Lydia的博客 1040
上一篇: 利用Objective-C分类对“私有成员,方法”的静态动态实现
下一篇: 栈与堆的区别
RannieR
博客等级 码龄14年 180粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值