iOS内存管理--ARC

iOS中的内存管理机制(ARC和MRC) ARC和MRC是iOS中两种不同的内存管理机制。ARC是自动引用计数,由编译器在编译时自动插入内存管理代码,而MRC是手动引用计数,开发者需要手动管理对象的引用计数。 阅读详情
arc是一个编译特性用来提供自动管理Objective-c的内存。ARC的目的是把你从内存管理的泥潭中解放出来,更多的去关注你要做的事情。
Arc是在编译的时候插入代码来确信让对象能够按需要来存在。ARC同样是以引用计数为基础。你可以选择在以文件或者项目为单位不使用ARC。
但是建议尽量最好使用ARC,首先,编译器为你做内存管理往往比你自己要更优秀,其次,ARC导致的效率损失在UI面前基本可以忽略不计。



ARC有以下强制规则:
1. 你不能显示的调用dealloc,实现或调用retain,release,retainCount,autorelease。
    你可以实现自己的dealloc,目的是为了把代理设置为空,或者编译的时候没有用到ARC的代码。
2. 不能使用NSAllocateObject 和 NSDeallocateObject
3. 不能在C结构体中使用对象指针 ---原因
4. 不能直接转换id 和 void *
5. 不能使用NSAutoreleasePool,被更有效率的@autoreleasepool取代了。
6. 不能直接使用以new开头的accessor,意味着不能使用以new开头的属性,除非你指定一个不同的名字。如下:
//Won't work
@property NSString *newTitle;
//Works
@property (getter = theNewTitle) NSString *newTitle;

ARC引入了新的关于变量生命周期的限定词。
__strong 默认的限定符,只要有强指针指向对象,就可以一直存活
__weak  指定一个引用,这个引用不能保持这个引用的对象存活,没有强对象指向它的话,弱引用就会被设置为nil
__unsafe_unretained 这个引用不能保持这个引用的对象存活,没有强对象指向它的话,弱引用就不会被设置为nil,如果它指向的对象释放了的话,这个指针就成为悬挂指针。
__autoreleasing 用来代表通过引用传递并且在返回时自动释放的参数。
必须正确的使用这些限定符。
NSString * __weak string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];
NSLog(@"string: %@", string);
这个weak使用就是不恰当的,因为没有任何强指针指向string,string立即就会被释放了。

栈变量都被初始化为nil。

你需要注意通过引用传递的对象。
NSError *error;
BOOL OK = [myObject performOperationWithError:&error];

-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
这个调用实际的代码是:
NSError * __strong error;
NSError * __autoreleasing tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
因为形式参数是__autorelease和实际参数是__strong,所以编译器会创建临时变量。

ARC需要在你的init方法中把[super init]的返回值赋给你的self
self = [super init];
if (self) {
}


struct myStruct {id x; float y;}

因为x默认是强类型,编译器不能安全地合成所有以使其正常工作所需的代码。比如你把一个指向该结构的指针传递给别的函数,结构体里面的id必须在结构被free掉之前释放,但是编译器不能可靠的做到这些。因此在ARC中不能在结构体中使用强对象。可以使用以下解决方案:
1. 使用Objective-C Objects 代替结构体,这是最好的方式

2  使用void*替代。

3. 使用_unsafe_unretained限定符来比标示对象引用
struct myStruct {NSString *__unsafe_unretained s; float y;}
当然这可能是有问题的,是不安全的,如果该对象能从指针下被释放。但是它对那些像字符串常量这样永远不能改变的东西是非常有用的。

管理 Toll-free转换
在许多Cocoa应用中,需要用到Core Foundation类型的对象。编译器不能自动管理Core Foundation对象,需要调用CFRetain和CFRelease类似的Core Foundation内存管理规则。
当你需要转换Objective C和Core Foundation对象时,需要使用cast函数或者Core Foundation的宏显示的告诉编译器你们之间的语义关系。

__bridge 转换Objective C和Core Foundation之间的指针,不转移拥有关系。
__bridge_retained 或者CFBridgingRetain转换一个Objective c指针到Core Foundation 指针并且转移拥有关系。你需要自己释放对象的关系。
__bridge_transfer 或者CFBridgingRelease将一个非Objective指针转换为Objective C的指针并且转移关系到ARC,不需要自己释放对象的关系
比如:以前的代码
- (void)logFirstNameOfPerson:(ABRecordRef)person {
    
NSString *name = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    
NSLog(@"Person's first name: %@", name);
    [name 
release];
}
在ARC中转化为以下代码。
- (
void)logFirstNameOfPerson:(ABRecordRef)person {
    
NSString *name = (NSString *)CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
    
NSLog(@"Person's first name: %@", name);
}

使用生命周期限定符来避免强引用循环
典型的是在父子继承层次中,父类需要引用了子类,子类同时也用到了父类,需要把父类中定义为strong,而子类中定义为weak。其他一些情况就比较难以琢磨,特别是调用了block对象。
在MRR中,__block id x 不增加x的引用计数,而在ARC中是增加引用计数的。为了在ARC中获得在MRR中同样的行为,需要使用__unsafe_unretain __block id x;但是这又是危险的且不鼓励的。更好的选择是使用__weak 或者设置把__block id的值设置为nil来跳出retain循环。
以下代码片段阐述了这个观点。
最原始的代码是这样的。
MyViewController *myController = [[MyViewController alloc] init...];
myController.completionHandler =  ^(NSInteger result) {
    [myController dismissViewControllerAnimated:
YES completion:nil];
};
[self presentViewController:myController animated:YES completion:^{
    [myController release];
}];

可以定义为block,并且在block里面设置为nil
MyViewController * __block myController = [[MyViewController alloc] init...];
myController.completionHandler =  ^(NSInteger result) {
    [myController dismissViewControllerAnimated:
YES completion:nil];
    myController = 
nil;
};

同样可以定义一个临时的weak变量。
MyViewController *myController = [[MyViewController alloc] init...];
MyViewController * __weak weakMyViewController = myController;
myController.completionHandler =  ^(NSInteger result) {
    [weakMyViewController dismissViewControllerAnimated:
YES completion:nil];
};

对于特殊的引用循环,你需要这样使用。
MyViewController *myController = [[MyViewController alloc] init...];
MyViewController * __weak weakMyController = myController;
myController.completionHandler =  ^(NSInteger result) {
    MyViewController *strongMyController = weakMyController;
    
if (strongMyController) {
        [strongMyController dismissViewControllerAnimated:YES completion:nil];
    } else {
    }
};
上述代码阐述了生命周期限定符的使用,需自己多揣摩。下一篇介绍以下Core Foundation内存管理,之后会介绍ios并发编程和线程。
iOS之深入解析内存管理MRC与ARC机制 一、内存管理 ① 什么是内存管理? 当我们编写程序的时候,会声明各种各样的变量,编写各种各样的代码,它们都会占用内存,但是并不是所有的代码和内存都是由我们进行释放。 内存分为5个区域:栈、堆、bss段、数据段、代码段。 栈:存放的是局部变量,当局部变量的作用域结束的时候就会由系统进行释放局部变量所占用的内存空间; 堆:存放的是程序员手动申请的变量,手动申请的变量可以由程序员手动编写代码进行释放; bss段:存放的是为初始化的全局变量和静态变量,当全局变量和静态变量进行初始化的时候系统就会回收他们所占用的 阅读详情

相关推荐

iOS非ARC内存管理详解

在非ARC环境中,开发者需要显式地管理对象的引用计数,以确保对象在不再需要时能够正确释放内存,避免内存泄漏。在早期的iOS版本中,手动管理内存是必要的,这就是所谓的非ARC(Automatic Reference Counting)内存管理。retain方法用于增加对象的引用计数,表示有一个新的指针指向该对象。添加到自动释放池中,这样在自动释放池被释放时,对象的引用计数将减少1。关键字用于修饰一个对象的引用,表示弱引用,即不会增加对象的引用计数。在非ARC环境中,我们需要手动管理对象的内存,通过调用。

ByteSparkX的博客 88

内存管理(二) ARC

内存管理(二) ARC 上篇我们介绍了MRC,本篇我们介绍下ARC ARC概述 ARC是一种编译器功能,它通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编译时在合适的地方为 OC 对象插入retain、release和autorelease代码来自动管理对象的内存,从而彻底解放程序员。 ARC不能解决的问题 Block等引发的循环引用问题(更多循环引用看我这篇文章) 底层 Core Foundation 对象需要手动管理 所有权修饰符 __strong __weak __

iOS随笔 3041

深入理解iOS内存管理与ARC

本文详细探讨了Objective-C和Swift中内存管理的机制,特别是自动引用计数(ARC)的应用。通过实例变量、访问器方法、内存管理语义等多个角度,深入解析了如何优化内存使用、避免内存泄漏和循环引用,并提供了关于方法命名和内存管理的规则。文章还涵盖了如何通过编程实践,例如使用类别和属性,以及如何通过运行时特性来管理内存。

weixin_35592186的博客 360

ARC内存管理

ARC 内存管理: 注意三点: 一: 不要出现循环引用 二: 如果出现 Core Foundation 对象(如: CFStringRef, CTFontRef)需要使用     CFRetain(对象)、 CFRelease(对象)来管理。 另外可以通过 桥接,     桥接的三种方式 __brid

dingyanpeng的博客 623

使用amp训练出现Detected call of lr_scheduler.step() before optimizer.step().

这个警告是怎么产生的?是由于在算梯度的时候出现了nan,所以这一次更新会跳过,但是参数仍旧会更新所以出现了问题,按下面的做法加一个判断就行了。但是在使用amp进行混合精度训练出现的一个warning,调换代码顺序也不work。正常在训练的时候,对于优化器和参数更新的顺序这样就可以了。

weixin_46214675的博客 1306

Oracle EBS R12 AP模块发票导入接口实战:从SQL插入到API调用的完整流程

本文详细解析了Oracle EBS R12 AP模块发票导入接口的完整流程,从SQL插入到API调用的实战技巧。涵盖接口表设计、数据验证、双通道导入机制及错误诊断,特别分享官方文档未提及的高阶优化方案,助力企业实现财务数字化转型。

weixin_33728268的博客 476

ARC章节的学习笔记

什么是ARC 引用计数 即OC中的内存管理, ARC即字自动引用计数,是指内存管理中对引用采取自动计数的技术,通过ARC,就可不用键入retain和release代码。 ARC状态 生成 持有 释放 飞起 内存管理的思考方式 自己生成的对象自己持有 ...

qq_44865905的博客 505

实用电路精讲系列---双级运放放大电路(差分放大+跟随缓冲)

本文分析了双极运放放大电路的工作原理及其典型应用。该电路结合差分放大器和跟随缓冲器,实现高精度信号放大与阻抗匹配。差分放大器通过放大差模信号并抑制共模噪声提升信噪比;跟随缓冲器则提供阻抗变换,确保信号稳定传输。两者协同工作可优化输入阻抗、增强噪声抑制并提高设计灵活性。文章还列举了10个典型应用案例,包括医疗设备、工业传感器和新能源系统等,展示了该电路在精密电子系统中的关键作用。最后通过实用电路分析,详细说明了各模块功能及设计注意事项。

weixin_40590799的博客 2954

Swift 开发教程系列 - 第11章:内存管理和 ARC(Automatic Reference Counting)

在 Swift 中,内存管理由 ARC(自动引用计数)机制自动处理。ARC 通过追踪和管理对象的引用计数来确保分配的内存得到有效释放。尽管 ARC 在大多数情况下能够高效地管理内存,但理解其工作原理仍然十分重要,因为不当的引用会导致内存泄漏或循环引用。本章将介绍 ARC 的基本原理、强引用和弱引用的使用、循环引用的识别和解决方法。

小创果技术交流博客 1075

【R语言】富集分析可视化代码(整理版)

分别介绍了如何使用DAVID在线分析工具对基因进行GO/KEGG功能富集分析、使用R ggplot包对获得的基因GO/KEGG功能富集结果进行可视化、使用R clusterProfiler包和R AnnotationHub包对基因进行GO/KEGG功能富集分析、OrgDb包制作以及结果可视化等。故,我重新整理了一波,并补充了可对多个分组的富集结果进行可视化以及富集结果绘制圈图等的代码。关注“在打豆豆的小潘学长”公众号,发送“富集分析3”获得完整代码包和演示数据。一、单组富集结果可视化。

weixin_54004950的博客 1万+

Qt+OpenGL+Cesium三件套:打造高性能3D GIS桌面应用的5个关键点

本文深入探讨了如何利用Qt、OpenGL和Cesium数据规范构建高性能桌面级3D GIS应用。文章聚焦于五个关键点:架构选型、OpenGL渲染优化、3D Tiles数据解析与调度、内存与多线程管理,以及高级特性实现,旨在帮助开发者在C++生态中打造不依赖网络、运算能力更强的重型3D地理信息客户端。

weixin_28197941的博客 380

捋捋ARC

定义:wiki 引用计数: 引用计数是来用帮助oc进行内存回收的机制,如上图表示的代码类似于NSObject *p1 = [NSObject new]; NSObject *p2 = p1; NSObject *p3 = p1指针指向了同一块内存区域,即对象存放的区域,用引用计数来描述的话,此刻对象的引用计数为3。 在引用计数为0时该内存区域将被回收用于存储其他。 MRC(ma

iOSiri的博客 551

Python爬虫:招聘网站岗位要求、薪资与求职者数据爬取与分析

通过本文的教程,我们学习了如何通过 Python 编写招聘数据爬虫,爬取招聘网站上的岗位要求、薪资和求职者数据,并通过数据存储、清洗、分析和可视化,获取有价值的信息。网站如智联招聘、猎云网、前程无忧等,都提供了大量的招聘信息,包括岗位要求、薪资范围、工作经验、学位要求、招聘公司等。本文将介绍如何通过 Python 编写爬虫,爬取招聘网站上的岗位要求、薪资、求职者数据,并通过数据存储、分析和可视化等手段,为求职者或招聘者提供实用的信息和决策支持。通过循环抓取多个页面的数据,可以获取不同岗位的信息。

2201_76125261的博客 722

iOS ARC 内存管理

内存管理 前言 iOS开发中,内存管理是从来都不能忽视的问题,OC采用的是动态内存管理方式,跟踪每个对象被引用的次数,当对象引用次数为0时,则释放对象占用的内存。引用计数分为自动和手动计数(retain 引用、release释放,autorelease 废弃),在此我主要对自动引用计数做相关的分享。 自动引用计数 自动引用计数顾名思义是自动计数管理,...

damon_rao的博客 712

论文工具——写论文好用的绘图工具(甘特图+流程图+网络模型图+泳道图)

* 在写HiFi-GAN论文的代码阅读过程中,我发现仅仅通过文字来描述网络结构,不够详细,所以想绘制出网络结构图,更加具象化的描述出网络结构。想去花了,才发现之前都是通过在线绘图网站画的,费时费力,所以想找一些专门的网站化出比较规范并且高质量的图。一方面是为了方便讲解,提高论文的质量,另外一方面也是为了以后写论文打下良好的基础。 * 这篇文章会根据我以前的画图经验展开,以前是使用绘图软件,手动绘图。后来,看到了其他的方法,但是需要写一些代码,或者需要安装特定的软件,投入成本太大,就没有学。所以,本文分享的工

Blackoutdragon的博客 1万+

布尔可满足性问题(SAT)深度研究

布尔可满足性问题(Boolean Satisfiability Problem, SAT)是计算机科学和数理逻辑中的一个核心决策问题。其定义为:对于一个给定的布尔逻辑公式,判断是否存在一组对其变量的真值赋值(即,为每个变量指定真 (True) 或假 (False)),使得该公式的最终计算结果为真。如果存在这样的赋值,则称该布尔公式是可满足的 (satisfiable);否则,称其为不可满足的 (unsatisfiable)。

步子哥的博客 496

iOS内存管理——ARC篇

文章目录前言内存管理的思考方式所有权修饰符__strong 修饰符__weak修饰符__unsafe_unretained修饰符__autoreleasing修饰符ARC规则 前言 什么是ARC? ARC 是 Automatic Reference Counting 的缩写, 即自动引用计数. 这是苹果在 iOS5 中引入的内存管理机制.不仅能够降低程序崩溃和内存泄露的风险, 而且可以减少开...

咚个里个呛的博客 709

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iOS ARC内存管理

iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解。还是不简单的。随着ARC(自动管理内存)的流行。iOS开发者告别了手动管理内存的复杂工作。但是自动管理内存也不是万能的,一不小心还是会出现内存泄漏的问题。本文探讨一下iOS下的自动管理内存机制。 ARC的本质 ARC是编译器特性,而不是运行时特性,更不是垃圾回收机制(GC) ARC是...

ddiv24492的博客 202

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

iOS ARC内存管理总结

特酷吧[tekuba.net]采用"署名-非商业用途-保持一致"的创作共用协议,使用本文内容请遵循该协议。 博主在现在的公司已经两年了,现在正考虑着换工作。趁着这个机会,准备把一些基础的iOS知识系统的整理下,这一篇就来说说iOS内存管理方面的,主要是ARC环境。后面可以看到,虽然ARC在本质上也是采用了引用计数的概念,但作为开发者来讲,ARC环境基本上很少考虑非ARC环境中的复杂的引用计数关系

晓月的专栏 2051

计算机控制技术及应用

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

iOS开发ARC内存管理技术要点

iOS开发ARC内存管理技术要点 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节。这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验。详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:)

mumuyinyin的博客 438

iOS内存管理 ARC与MRC

想驾驭一门语言,首先要掌握它的内存管理特性。iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解。 说到iOS开发,肯定离不开objective-c语言(以下简称OC)。OC的内存管理机制叫做引用计数,就是一块内存地址可以同时被多个对象引用,每引用一次,引用计数都会递增1,当对象每解除一次引用,引用计数就会递减1,直到引用计数为0时,系统才会讲这块内存...

dfdjbv4645的博客 183

ios内存管理(ARC MRC 内存分区 野指针)

ios内存分配(堆和栈) iOS之从MRC到ARC oc野指针和僵尸对象

baidu_40537062的博客 692

iOS- 非ARC的项目内存管理细节详解(实战)

1.前言   接上文:iOS- 如何将非ARC的项目转换成ARC项目(实战) 2.内存管理时相关的配置   当我们把将非ARC的内存管理都管理好后,发现在做有些操作的时候内存还是在一直的缓慢增加 比如做一个最简单的随机数UITableView的显示与滑动,进行内存管理后,不应该出现内存增加的,但是一直滑动内存就一直缓慢的往上增加的情况。 这时候我们可以检查下看这里的属性是否...

alexhua1444的博客 193

iOS开发ARC内存管理与Block概要,你都懂了吗?

本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节。这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验。详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质ARC

仰望星空 1504

ARC环境下iOS内存管理总结

自动引用计数,又称ARC(Automatic Reference Counting)是苹果在iOS5中引入的重要特性,它减少了我们在内存管理时的麻烦,让我们可以把更多的精力放在其它更重要的事情上。 虽然ARC给我们带来了很多方便,但如果开发者不了解基本的内存管理知识,还是会在开发工作中遇到很多问题。所以,我总结了ARC环境下应该知道的内存管理知识,供诸位参考。 基于引用计数的内存管理 要了解ARC...

ChaseRaod的博客 535
上一篇: iOS内存管理
下一篇: iOS内存管理--Core Foundation
MakeCodeClear
博客等级 码龄14年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值