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)相关推荐

  1. OC 知识:彻底理解 iOS 内存管理(MRC、ARC)

    1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用一个函数或者方法 而一个移动设备的内存是有限的,每个软件所能占用的内存也是有限的 ...

  2. iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

    本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...

  3. iOS 内存管理arc

    http://www.tekuba.net/program/346/ ios自动释放池(autoreleasepool #import <Foundation/Foundation.h> ...

  4. iOS内存管理机制解析

    软件运行时会分配和使用设备的内存资源,因此,在软件开发的过程中,需要进行内存管理,以保证高效.快速的分配内存,并且在适当的时候释放和回收内存资源. 一.Objective-C内存管理的对象 IOS开发 ...

  5. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    本文作者:王拥军 腾讯自选股高级开发工程师 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创. 对于i ...

  6. 终于明白那些年知其然而不知其所以然的iOS内存管理方式

    终于明白那些年知其然而不知其所以然的iOS内存管理方式 前言 从我开始学习iOS的时候,身边的朋友.网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于1则对象保存在内存的堆中而引用 ...

  7. iOS内存管理 —— 自动释放池和runloop

    iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...

  8. iOS - 内存管理 01

    iOS - 内存管理 01 一.概述 内部管理简单来说就是计算机内部存储的管理,我们从冯·诺依曼结构说起,冯·诺依曼结构指出了计算机由运算器.控制器.存储器.输入和输出设备几大部件组成.拿 iPhon ...

  9. iOS 内存管理机制与原理

    内存分区 内存一般分为五大区:栈区.堆区.常量区.全局区.代码区.如图 1.栈区 是由编译器自动分配并释放的,主要用来存储局部变量.函数的参数等,是一块连续的内存区域,遵循先进后出(FILO)原则.一 ...

最新文章

  1. 利用mail实时监测服务器程序状态
  2. 服务器的系统如何入账,云服务器费用如何入账
  3. Django:ORM基本操作-CRUD,管理器对象objects,----->查询3(单条更新,批量更新)
  4. DeNA/上海纵游通过使用AWS大量缩短新款游戏和服务的上线时间
  5. 【Matlab免费安装】
  6. python神经网络算法pdf_深度学习:卷积神经网络从入门到精通 PDF 原书扫描版
  7. [经验] 【安富莱——DSP教程】第7章 DSP定点数和浮点数(重要)
  8. 解决WebStorme点击谷歌浏览器图标无反应问题
  9. RK3399 4.4内核 修改DDR频率
  10. numpy一行转为一列
  11. 没有对象,你凭什么成为百万富翁
  12. matlab迭代分水岭分割,matlab分水岭分割算法
  13. 使用多个路由器有线桥接实现无线漫游/Lan口连接
  14. android is not translated in 报错解决方案
  15. 作为技术分析工具的 MTF 指标
  16. 传奇3服务器配置文件,服务器技术交流_GowLom2战神引擎GameServer配置文件说明_-921根据地_只做有质量的游戏 - Powered by Discuz!...
  17. 20230210组会总结
  18. java之字符串--回文字符串
  19. QT的Graphics View柜架
  20. CheckStyle 编写自己的代码检查插件

热门文章

  1. GPU Gems2 - 7 带位移映射的细分表面自适应镶嵌
  2. 2021-04-05
  3. 今天第一次开通blog
  4. 初识单点登录及JWT实现
  5. Delphi及C++Builder经典图书一览表(持续更新中2018.01.02)
  6. 大话设计模式之策略模式
  7. VS2017 网站打包发布生成的文件中包含.pdb文件,解决办法
  8. 范围查询 BETWEEN AND
  9. js 对已知数组数据的导出EXCEL
  10. JDBC事务--软件开发三层架构--ThreadLocal