iOS内存管理机制解析之MRC手动引用计数机制
前言:
iOS的内存管理机制ARC和MRC是程序猿參加面试基本必问的问题,也是考察一个iOS基本功是
否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了。
iOS内存管理机制发展史
iOS 5曾经 :MRC(手动引用计数)
iOS 5及以后:ARC (自己主动引入计数)
MRC机制时代
“谁开辟申请,谁及时合理释放” 面对自己申请的内存空间是要及时进行回收的:
不及时释放会造成什么结果?
对象存储在栈上。可能会大量的占用内存,内存不足造成程序闪退(也就是所说的内存泄露)
不合理释放会造成什么后果?
提前释放掉,倘若后面继续对该对象进行引用操作,会出现崩溃。出现EXC_BAD_ACCESS
操作已经释放掉的对象的崩溃提示。(也就是所说的野指针)
MRC机制时代对于iOS程序猿来说是有些痛苦的,那么我们深入的解析一下
内存管理原则 —-配对原则
解释:使引用计数(retainCount)+1的时候必须相相应的出现使引用计数-1
如何使引用计数+1 ?
new
copy(mutablecopy)
retain
alloc
如何使引用计数-1?
release
autorelease
比如:
[对象 release]; reatinCount-1
[对象 retain]; reatinCount+1,而且返回self
推断一个对象能否被系统回收?
正藏情况下能被系统回收的对象唯一根据是该对象的引用计数(retainCount)为0
再谈谈dealloc函数
//当实例变量的引用计数为0,系统会自己主动调用dealloc函数进行摧毁回收
- (void)dealloc{}
重写dealloc函数时应注意:
重写dealloc时须要对用父类的dealloc函数
倘若有子类须要销毁顺序应在父类上面。避免出现不必要的错误
- (void)dealloc
{
[子类变量 release];
[super dealloc];
}
ARCproject如何转变为MRCproject
YES—->NO
MRC实战中常见错误
准备工作
创建一个project–>创建一个名为List的类名—>类中创建一个name变量@property NSString *name;
—->重写dealloc方法(这样内存运用的得当否直接根据打印看到)
-(void)dealloc
{
NSLog(@"我的内存要被释放了");
[super dealloc];
}
1. 使用变量没有遵守配对原则,造成的内存泄露
#import <Foundation/Foundation.h>
#import "List.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
List *l=[[List alloc]init]; // reatinCount=1
l.name=@"苹果";
NSLog(@"%lu",l.retainCount);
//[l release];
}
return 0;
}
执行结束后l的引用计数仍然为1,并没有调用dealloc
2.遵守配对原则但因为错误使用nil,造成的内存泄露
List *l=[[List alloc]init];
l.name=@"苹果";
NSLog(@"%lu",l.retainCount);
l=nil;
[l release];
在操作类对象的时候喜欢在最后一次release的后面讲对象=nil,避免其它地方引用对象造成崩溃,但放的位置不对则会出现像上面那样的内存泄露 [l release]此时等价于[nil release],而l的引用计数为1。并没有及时释放
3.提前释放对象,造成野指针操作
List *l=[[List alloc]init];
l.name=@"苹果";
NSLog(@"%lu",l.retainCount);
List *l1=l;
[l release];
NSLog(@"%@",l1.name);
l1=l,此时有两个指针同一时候指向同一个类地址。当一个指针release造成 reatinCount=0释放 了类的内存空间,而还有一个指针也将指向空,就会引发野指针异常
4.当一个对象retainCount已经为0 时,调用retain方法,是不会使得对象起死回生的,同一时候还会发生野指针操作异常
List *l=[[List alloc]init];
l.name=@"苹果";
NSLog(@"%lu",l.retainCount);
[l release];
[l retain];
5.MRC下set和get方法的重写
@interface List : NSObject
{
NSString *_name;
}
-(void)setName:(NSString *)name;
-(NSString *)name;
@end
@implementation List
-(void)setName:(NSString *)name
{
if (_name!=name) {
[_name release];
_name=[name retain];
}
}
-(NSString *)name
{
return _name;
}
@end
iOS内存管理机制解析之MRC手动引用计数机制的更多相关文章
- python-面试常用 --变量、内存管理(小整数池,引用计数)
执行Python程序的两种方法 第一种:交互式(jupyter就是对这种进行了封装) 优点:直接给出结果 缺点:无法保存 第二种:命令行式,通过Python解释器输入文本(pycharm对这种进行了封 ...
- IOS内存管理「4」- ARC 和垃圾回收机制的基本概念
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- iOS 内存管理:从 MRC 到 ARC 实践
对于 iOS 程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与 C 语言完全不同的. iOS 内存管理的核心是引用计数. 接触 MRC 时遇到最头疼的问题就是:为什么那么多 rel ...
- iOS内存管理(objective-c)
移动app开发中,由于移动设备内存的限制,内存管理是一个非常重要的话题.objective-c的内存管理,不仅是面试当中老生常谈的一个必问话题,也是日常项目开发中,特别需要重视的环节.对于笔者这种以j ...
- iOS内存管理retain,assign,copy,strong,weak
转自:http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html iOS的对象都继承于NSObject, 该对象有一个方法:retain ...
- OC 知识:彻底理解 iOS 内存管理(MRC、ARC)
1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用一个函数或者方法 而一个移动设备的内存是有限的,每个软件所能占用的内存也是有限的 ...
- 浅谈iOS内存管理机制
iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...
- iOS内存管理 ARC与MRC
想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...
随机推荐
- 【单调队列】bzoj 1407 [HAOI2007]理想的正方形
[题意] 给定一个n*m的矩阵,求所有大小为k*k的正方形中(最大值-最小值)的最小值 [思路] 先横着算出每一行的长度为k的窗口内的最大值,变成一个n*(m-k+1)的矩阵mx 再竖着算出每一列的长 ...
- 【2018.11.22】CTSC2018(模拟赛!)
太蠢了……$noip$ 后第一次模拟赛竟然是这样的……完全就是打击自信 / 降智…… 1. 假面 一道神仙概率 $dp$!第一次写…… 拿到题就发现血量 $m_i$ 的上限只有 $100$! 然后 $ ...
- 花匠(codevs 3289)
题目描述 Description 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花 ...
- MySql将查询结果插入到另外一张表
今天遇到一个业务需求是这样的:对在职员工超过55岁提醒.我想的思路是查询员工表,然后将超过55岁的人的信息存到另一个表,并且以消息的形式给用户提示,用户处理掉之后此消息失效(在数据库做标记). 不管是 ...
- dos中定义变量与获取常见的引用变量以及四则运算、备份文件(set用法)
在dos中使用set定义变量: set a=8 (注意等号两边没有空格) 引用变量如: echo %a% 将打印a的值 (%a%是获取变量a的值) dos中 ...
- Xcode6 pch文件
XCode6里, 默认是没有pch文件的,如果我们想使用pch文件,需要手动添加,添加步骤如下 1.在XCode6中是么有pch文件的,如下图 2.创建pch文件 3.配置pch文件 ...
- android的系统学习
先从Android的应用开发开始,等到对应用掌握的比较熟悉了,开始慢慢阅读一些Android 应用框架层的源代码,然后再渐渐往下去了解Android的JNI.Libraries.Dalvik虚拟机.H ...
- Ajax 实现文件的下载
JQuery的ajax函数的返回类型只有xml.text.json.html等类型,没有“流”类型,所以我们要实现ajax下载,不能够使用相应的ajax函数进行文件下载.但可以用js生成一个form, ...
- python练习之-计算器
学习以堆栈模式编写-计算器 堆栈特点:先进后出, 如下: #!/opt/python3/bin/python3 # Author: yong import re def is_symbol(eleme ...
- T2597 团伙 codevs
http://codevs.cn/problem/2597/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 1920年的芝加 ...