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内存管理的更多相关文章

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

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

  2. iOS内存管理个人总结

    一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称 ...

  3. IOS内存管理学习笔记

    内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...

  4. iOS内存管理编程指南

    iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...

  5. iOS内存管理(一)

    最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...

  6. iOS内存管理 ARC与MRC

    想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...

  7. 75.iOS内存管理

    堆区和栈区 1.栈区:由编译器自动分配释放,函数的参数值,局部变量等值 2.堆区:一般由开发人员分配释放,若不释放,则可能会引起内存泄漏 NSString *string = @"abcd& ...

  8. 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方 ...

  9. iOS内存管理策略和实践

    转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...

随机推荐

  1. java-final关键字

    一.final理解 编程语言中关键字,final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个 ...

  2. Centos 6.5 rsync+inotify 两台服务器文件实时同步

    rsync和inotify是什么我这里就不在介绍了,有专门的文章介绍这两个工具. 1.两台服务器IP地址分别为: 源服务器:192.168.1.2 目标服务器:192.168.1.3 @todo:从源 ...

  3. Javascript中数组与字典(即map)的使用

    简述: 简单记录一下数据结构Map和数组, 其实在Javascript这种弱类型的脚本语言中,数组同时也就是字典,下面主要就是字典数组的简易使用   代码: 1. 数组中添加map <!DOCT ...

  4. Hue

    Hue是一个开源的Apache Hadoop UI系统,由Cloudera Desktop演化而来,最后Cloudera公司将其贡献给Apache基金会的Hadoop社区,它是基于Python Web ...

  5. React Native For Android 环境搭建

    一. 环境搭建 1. JDK更新 http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 使用最新的 ...

  6. 6、Samba 服务器配置

    1.安装samba服务 [root@rhel6_80 samba]# yum -y install samba #安装samba [root@rhel6_80 samba]# rpm -qa |gre ...

  7. Three.js开发指南---使用three.js里的各种光源(第三章)

    本章的主要内容 1 three.js有哪些可用的光源 2 什么时候用什么光源. 3 如何调整配置各种光源 4 如何创建镜头炫光 一 光源 光源大概有7种, 其中基础光源有4种 环境光(AmbientL ...

  8. [2016.01.18]文本替换专家 v5.3

    文本替换专家,界面简洁易用,功能强大实用.支持大小写匹配,支持多级目录.多行文本.多种文件格式的同时批量查找和批量替换.智能准确的区分ANSI.UTF-8(包括无BOM的UTF-8).Unicode. ...

  9. MS SQL执行大脚本文件时,提示“内存不足”的解决办法()

    问题描述: 当客户服务器不允许直接备份时,往往通过导出数据库脚本的方式来部署-还原数据库, 但是当数据库导出脚本很大,用Microsoft SQL Server Management Studio执行 ...

  10. lumen 构建api(dingo api)

    什么是 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力, ...