前言:

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函数时应注意:

  1. 重写dealloc时须要对用父类的dealloc函数

  2. 倘若有子类须要销毁顺序应在父类上面。避免出现不必要的错误

    - (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手动引用计数机制的更多相关文章

  1. python-面试常用 --变量、内存管理(小整数池,引用计数)

    执行Python程序的两种方法 第一种:交互式(jupyter就是对这种进行了封装) 优点:直接给出结果 缺点:无法保存 第二种:命令行式,通过Python解释器输入文本(pycharm对这种进行了封 ...

  2. IOS内存管理「4」- ARC 和垃圾回收机制的基本概念

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

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

  4. iOS 内存管理:从 MRC 到 ARC 实践

    对于 iOS 程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与 C 语言完全不同的. iOS 内存管理的核心是引用计数. 接触 MRC 时遇到最头疼的问题就是:为什么那么多 rel ...

  5. iOS内存管理(objective-c)

    移动app开发中,由于移动设备内存的限制,内存管理是一个非常重要的话题.objective-c的内存管理,不仅是面试当中老生常谈的一个必问话题,也是日常项目开发中,特别需要重视的环节.对于笔者这种以j ...

  6. iOS内存管理retain,assign,copy,strong,weak

    转自:http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html iOS的对象都继承于NSObject, 该对象有一个方法:retain ...

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

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

  8. 浅谈iOS内存管理机制

    iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...

  9. iOS内存管理 ARC与MRC

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

随机推荐

  1. Spring JdbcTemplate 查询方法中的RowMapper实现汇总

    实现一.在内部建立内联类实现RowMapper接口 package hysteria.contact.dao.impl; import java.sql.ResultSet; import java. ...

  2. 商务旅行(codevs 1036)

    题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...

  3. Codevs 3111 CYD啃骨头

    时间限制: 1 s   空间限制: 128000 KB   题目等级 : 黄金 Gold 题目描述 Description: CYD吃饭时有N个骨头可以啃,但CYD要午睡了,所以他只有M分钟吃饭,已知 ...

  4. 51nod1053 最大M子段和 V2

    $n \leq 50000$的序列,问选不超过$m \leq 50000$个区间使得和最大. 如果正数区间总数比$m$小那肯定全选.否则有两种方式减少区间数量:丢掉一个正区间:补一个负区间连接两个正区 ...

  5. 转载 gdb调试程序

    转载自csdn,作者haoel,链接http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一 ...

  6. Hello SpringMVC

    1. MVC框架能做哪些事情? 讲url映射到java类或者方法 封装用户提交的数据 处理请求-调用相关业务处理-封装相应数据 将相应数据进行渲染 jsp/html/freemaker等 ... 2. ...

  7. js 中 Map/Set 集合

      Map Map是一组键值对的结构,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array: 1 var names = ['Michael', ...

  8. "听话"的品格的症状

    反思了一下,也许是因为以前比较听话,听大人的话,听老师的话,听长辈的话.听电视剧的话..........哈哈 现在发现,世界是靠自己去认识,去体会的,别人的经验都只能作为参考,绝对不能不加思考的照搬硬 ...

  9. 【转】DSP是什么--DSP是神马东东??

    原文:http://www.eepw.com.cn/article/272908.htm 导读:本文主要介绍的是DSP是什么,不懂得童鞋们快随小编一起学习一下DSP到底是个神马东东吧! 本文引用地址: ...

  10. 关于Memcached的CAS和Set方法造成Socket泄漏的问题

    为了解决多并发下写Memcached的冲突方案,我们项目组引入了CAS机制.类同于Java并发包中的CAS(Compareand set)原子操作,用来处理同一个Item被多个线程更改的并发问题.Me ...