iOS内存管理
iOS内存管理的方式是引用计数机制。分为MRC(人式引用计数)和ARC(自动引用计数)、
为什么要学习内存管理?
内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能。一个对象的生命周期有生成,持有,释放,销毁。引用计数分为ARC,MRC,在MRC中,增加引用计数的方法是retain,alloc,new,copy。减少引用计数的方法是release, autorelease,当引用计数增减平衡的时候,系统会自动执行对象的dealloc方法,销毁对象,完成该对象的内存管理。有创建就必须有释放。
1.养成良好的内存管理习惯,可以从源头上避免内存问题的出现。
2.一旦出现内存问题,能够找到并用解决。(调试bug)
引用计数管理内存的理念是:通过控制内存或者对象的引用计数来实现生成,持有,释放,销毁对象的操作。
1.生成,对象的引用计数从0到1 - > 比如alloc
2.持有,增加一个引用,让对象的引用计数加1 - >比如 retain
3.释放,减少一个引用,让对象的引用计数减1 - > 比如 release autorelease
4.销毁,当对象的引用计数为0时,系统就会回收这个内存空间。 - > 比如 dealloc
当这块空间被系统回收之后 ,就不能通过指针去访问这块空间了,容易造成野指针。
切记!!引用计数这个概念,只存在于堆区区域,针对堆区的对象。
生成,对应的方法是 + (instancetype)alloc; 在堆区域开辟一块内存空间,存放对象,并且将内存清零,同时将此对象的引用计数变为1,是从0到1的过程。
//0 -> 1
Person *person = [[Person alloc] init];
//retainCount 这个方法可以查看对象的引用计数
NSLog(@"person is %p, person's retainCount is %lu",person, [person retainCount]);
//1
Person *p1 = person;
NSLog(@"p1 is %p, p1's retainCount is %lu", p1, [p1 retainCount]);
//持有, 方法是 retain,让对象的方法加1
//1 -> 2
[person retain];
NSLog(@"person is %p, person's retainCount is %lu",person, [person retainCount]);
//2 -> 3
[p1 retain];
NSLog(@"p1 is %p, p1's retainCount is %lu", p1, [p1 retainCount]);
//3 -> 4
Person *p2 = [p1 retain];
NSLog(@"p2 is %p, p2's retainCount is %lu", p2, [p2 retainCount]);
//释放 release,让对象的引用计数减1 ,而且是立即减1
[person release];
NSLog(@"%lu",[person retainCount]);
[person release];
[person release];
NSLog(@"%lu",[person retainCount]);
[person release];//在执行这条release消息之前,对象person的引用计数为1,release之后,引用计数为0,此时系统会自动试行dealloc方法,释放person对象,来完成person对象的内存管理。
//下面这行代码可以打印出retainCount,为1,因为系统内部引用计数的值没有0,0只是方便交流引入的一个数,但从本质上来说, 这行代码已经有可能造成了野指针,因为person对象已经被系统回收,再去访问[person retainCount]就会出现问题。
//野指针崩溃,是因为被回收的内存空间已经被占用了,再去访问会出现问题,不崩溃,只是侥幸,这块被回收的内存空间现在还没有被占用。
autorelease 此方法也是让对象的引用计数减1,不过区别于release,TA并不是立即减1,而是在未来的某个时刻,触发减1操作的这个时刻与自动释放池息息相关。
自动释放池是一个容器,来记录池子内部对象接收到的autorelease消息,哪个对象接收,接收了几次,谁先接收,谁后接收,当池子释放时,autorelease消息真正执行减1操作。
- (void)dealloc{
NSLog(@"我的天,%@已经被释放了",self);
[super dealloc];
}只要重写了dealloc,[super dealloc]永远都在最后一行。先将自身的实例变量释放掉,然后再去执行父类中的dealloc方法,释放,继承过来的实例变量。dealloc方法释放的顺序,正好与初始化方法,初始化顺序相反。
iOS内存管理的更多相关文章
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- iOS内存管理个人总结
一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称 ...
- IOS内存管理学习笔记
内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...
- iOS内存管理编程指南
iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...
- iOS内存管理(一)
最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...
- iOS内存管理 ARC与MRC
想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...
- 75.iOS内存管理
堆区和栈区 1.栈区:由编译器自动分配释放,函数的参数值,局部变量等值 2.堆区:一般由开发人员分配释放,若不释放,则可能会引起内存泄漏 NSString *string = @"abcd& ...
- iOS 内存管理-copy、 retain、 assign 、readonly 、 readwrite、nonatomic、@property、@synthesize、@dynamic、IB_DESIGNABLE 、 IBInspectable、IBOutletCollection
浅谈iOS内存管理机制 alloc,retain,copy,release,autorelease 1)使用@property配合@synthesize可以让编译器自动实现getter/setter方 ...
- iOS内存管理策略和实践
转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...
随机推荐
- 关于post请求超出最大长度
这是因为asp.net默认限制最大上传文件大小为4096kb,而我上传了6000kb+所以超出了限制,需要修改项目的web.config文件即可解决,可以将最大文件长度设置为你需要的长度,我这里设置为 ...
- Jquery序列化与反序列化备忘
序列化:JSON.stringify(obj) 反序列化:$.parseJSON(str)
- 自定义HttpModule的一些经验--配置篇
http://www.cnblogs.com/MyaSky/articles/2134954.html 自定义HttpModule的一些经验--配置篇 自定义web模块,需继承System.Web.I ...
- XML组成结构以及C#通过DTD验证规范性
XML 文档包含元素和属性等,它们提供一种灵活且功能强大的方法,为应用程序和组织之间交换数据.所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成: 1.元素 元素是XML的主要构建 ...
- JavaScript中常见的字符串操作函数及用法
JavaScript中常见的字符串操作函数及用法 最近几次参加前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等.如果你经常参加笔试或者也是一个过来人,相信 ...
- [Linux] - Docker移动数据到其它盘的办法
由于使用yum安装Docker,默认是数据是存放在系统盘/var/lib目录下,需要把它放到其实盘里头.方法可以这样做: 1.在其它盘中新建一个目录,比如我的:/yunpan/docker mkdir ...
- jquery 让滚动条处于div底部
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [综] Sparse Representation 稀疏表示 压缩感知
稀疏表示 分为 2个过程:1. 获得字典(训练优化字典:直接给出字典),其中字典学习又分为2个步骤:Sparse Coding和Dictionary Update:2. 用得到超完备字典后,对测试数据 ...
- MySql自增长列
1. 关键字 auto_increment 2. 自增用法 a) create table test(tid int auto_increment, tname varchar(10), primar ...
- HTTP 协议详解
相关文章:HTTP 协议之压缩 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相 ...