iOS内存管理(ARC,MRC)
iOS内存管理方式:
ARC Automatic Reference Counting 自动引用计数
MRC Manual Reference Counting 手动引用计数
更改管理方式:
内存管理的问题:
1、内存泄露:不再需要的对象没有释放。
2、野指针:正在使用的对象提前释放。
引用计数:
1、每一个对象上都有一个引用计数器
2、当对象出生时引用计数器为1
3、当对象调用retain方法时引用计数器+1
4、当对象调用release方法时引用计数器-1
5、当一个对象引用计数为0时,这个对象立即被回收
僵尸对象:过度释放的对象。
iOS为了优化app性能,不会马上处理僵尸对象,如图所示可以开启僵尸模式。
dealloc 方法:
当对象的retainCount=0时自动调用。
dealloc里release成员变量对象。
dealloc必须调用父类方法,[super dealloc]必须放在最后。
dealloc由系统自动调用,不能手动调用。
dealloc的优化 self.dog = nil;
内存管理原则:
谁申请,谁释放。
申请的方法:alloc new copy mutableCopy retain
释放的方法:release
@property修饰词补充:
1、默认assign
2、assign 主要修饰基本数据类型 int long float double 不添加任何管理内存的代码
3、retain 主要修饰OC对象 添加管理内存的代码
Autorelease自动释放池
(一)基本用法
(1)会将对象放到一个自动释放池中
(2)当自动释放池被销毁时,会对池子里的所有对象做一次release
(3)会返回对象本身
(4)调用完autorelease方法后,对象的计数器不受影响(销毁时影响)
(二)好处
(1)不需要再关心对象释放的时间
(2)不需要再关心什么时候调用release
(三)使用注意
(1)占用内存较大的对象,不要随便使用autorelease,应该使用release来精确控制
(2)占用内存较小的对象使用autorelease,没有太大的影响
(四)错误写法
(1)连续调用多次autorelease,释放池销毁时执行两次release(-1吗?)
(2)Alloc之后调用了autorelease,之后又调用了release。
(五)自动释放池
(1)在ios程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。
(2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中
(六)自动释放池的创建方式
(1)ios 5.0以前的创建方式
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
`````````````````
[pool release];//[pool drain];用于mac
(2)Ios5.0以后
@autoreleasepool
{//开始代表创建自动释放池
·······
}//结束代表销毁自动释放池
(七)Autorelease注意
(1)系统自带的方法中,如果不包含alloc new copy等,则这些方法返回的对象都是autorelease的,如[NSDate date];
(2)开发中经常会写一些类方法来快速创建一个autorelease对象,创建对象时不要直接使用类名,而是使用self
ARC内存管理机制
(一)ARC的判断准则:
只要没有强指针指向对象,对象就会被释放。
(二)指针分类:
(1)强指针:默认的情况下,所有的指针都是强指针,关键字__strong
(2)弱指针:_ _weak关键字修饰的指针
声明一个弱指针如下:
__weak Person *p;
ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作。
__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。
ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。
@property(nonatomic,strong)Dog *dog;// 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
如果换成是弱指针,则换成weak,不需要加__。
(三)ARC的特点总结:
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc]
(3)@property的参数:
Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
Weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
Assign:适用于非OC对象类型(基础类型)
MRC环境get方法实现:
//atomic下get方法
- (Keyborad *)kb {
[_kb retain];
[_kb autorelease];
return _kb;
}
//nonatomic下get方法
- (Keyborad *)kb {
return _kb;
}
MRC转ARC:
MRC与ARC混编:
ARCMRC
在的选项下下选择要不使用编译的文件,双击它,输入-fno-objc-arc即可
MRC工程中也可以使用ARC的类。
在的选项下下选择要使用编译的文件,双击它,输入即可
循环引用:A对象强指针引用了B对象,B对象强指针引用了A对象,彼此引用无法销毁。
解决方法:将其中的一条强指针改成用weak修饰的弱指针。
转载于:https://www.cnblogs.com/dxb123456/p/5487706.html
iOS内存管理(ARC,MRC)相关推荐
- OC 知识:彻底理解 iOS 内存管理(MRC、ARC)
1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用一个函数或者方法 而一个移动设备的内存是有限的,每个软件所能占用的内存也是有限的 ...
- iOS 开发:彻底理解 iOS 内存管理(MRC 篇)
本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...
- iOS 内存管理arc
http://www.tekuba.net/program/346/ ios自动释放池(autoreleasepool #import <Foundation/Foundation.h> ...
- iOS内存管理机制解析
软件运行时会分配和使用设备的内存资源,因此,在软件开发的过程中,需要进行内存管理,以保证高效.快速的分配内存,并且在适当的时候释放和回收内存资源. 一.Objective-C内存管理的对象 IOS开发 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
本文作者:王拥军 腾讯自选股高级开发工程师 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创. 对于i ...
- 终于明白那些年知其然而不知其所以然的iOS内存管理方式
终于明白那些年知其然而不知其所以然的iOS内存管理方式 前言 从我开始学习iOS的时候,身边的朋友.网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于1则对象保存在内存的堆中而引用 ...
- iOS内存管理 —— 自动释放池和runloop
iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...
- iOS - 内存管理 01
iOS - 内存管理 01 一.概述 内部管理简单来说就是计算机内部存储的管理,我们从冯·诺依曼结构说起,冯·诺依曼结构指出了计算机由运算器.控制器.存储器.输入和输出设备几大部件组成.拿 iPhon ...
- iOS 内存管理机制与原理
内存分区 内存一般分为五大区:栈区.堆区.常量区.全局区.代码区.如图 1.栈区 是由编译器自动分配并释放的,主要用来存储局部变量.函数的参数等,是一块连续的内存区域,遵循先进后出(FILO)原则.一 ...
最新文章
- 利用mail实时监测服务器程序状态
- 服务器的系统如何入账,云服务器费用如何入账
- Django:ORM基本操作-CRUD,管理器对象objects,----->查询3(单条更新,批量更新)
- DeNA/上海纵游通过使用AWS大量缩短新款游戏和服务的上线时间
- 【Matlab免费安装】
- python神经网络算法pdf_深度学习:卷积神经网络从入门到精通 PDF 原书扫描版
- [经验] 【安富莱——DSP教程】第7章 DSP定点数和浮点数(重要)
- 解决WebStorme点击谷歌浏览器图标无反应问题
- RK3399 4.4内核 修改DDR频率
- numpy一行转为一列
- 没有对象,你凭什么成为百万富翁
- matlab迭代分水岭分割,matlab分水岭分割算法
- 使用多个路由器有线桥接实现无线漫游/Lan口连接
- android is not translated in 报错解决方案
- 作为技术分析工具的 MTF 指标
- 传奇3服务器配置文件,服务器技术交流_GowLom2战神引擎GameServer配置文件说明_-921根据地_只做有质量的游戏 - Powered by Discuz!...
- 20230210组会总结
- java之字符串--回文字符串
- QT的Graphics View柜架
- CheckStyle 编写自己的代码检查插件