博客> iOS 内存管理总结
iOS 内存管理总结
2020-02-22 13:41 评论:1 阅读:1729 p4562891p
ios 内存管理 黄金法则 自动释放池

1.什么是内存管理:

内存管理是指软件运行时对计算机内存资源的分配和回收所使用的技术。

2.内存管理的作用:

实现高效,快速的分配,并且在适当的时候释放和回收内存资源。

3.为什么要内存管理。

1:计算机或者手机的内存总空间有限, 相对于动辄几百G的硬盘,我们的内存条只有4G,8G, 发烧友的32G ,这还是针对计算机而言,对于手机,则更小,目前市场上的手机主要内存大概 主流的也就是3G,4G(安卓) ,苹果只有2G。面对这么少的资源,如果不小心呵护,那么带来的只有灾难。

2: 内存造价昂贵,以至于我们不可能想硬盘那样,去挥霍内存,当然特别任性的除外。

3:程序的原因: 如果一个程序的所需要的内存少,运行的时间短,比如只输出一个hellow world,计算一个简单的加减法,我们也没有必要去管理内存,因为我们有几个G的内存,对付这些小菜,还是毛毛雨。 但是实际情况是,后期我们要设计的程序中,往往包含很多界面 ,一个界面中又会包含很多图片,按钮,等等资源,这些资源都是要消耗内存的,极端的例子就是游戏,一个好玩的游戏,对内存的要求是很高的,面对这些消耗内存大户,我们就不可能像以前那样财大气粗了,而应该像铁公鸡一样的节俭,甚至吝啬,才能保证我们的程序能够正常运行。

4.ipohe手机, iPhone手机应用程序对内存的管理要求很严格,iphone手机运行流畅也跟他的这个要求有关,一个应用所使用的内存超过200M就会发出警告,如果程序长时间处于高内存消耗状态,系统会在提醒三次后,结束该程序。应用开发出来就是被使用的,现在却因为内存问题,导致不能正常使用,我们就不得不考虑要采取相应的内存管理问题。

4.内存管理的最重要的两个问题:

1.)野指针错误 野指针是指指针指向了一块已经释放过的内存,进行一些违法操作。 野指针bug是大型项目的天敌。调试野指针错误是程序员最不愿意面对的错误之一。

2.)内存泄露 内存泄露并不是说计算机的内存条少了一块,而是指一块内存分配后使用后,没有释放和回收的情况。 坑1: 内存泄露编译器不会报错。 吭2: 内存泄露的严重后果: 内存泄露产生严重后果的产生是需要条件的。 一般的内存泄露,编译器会在程序运行结束后自动释放这些自己没有主动释放的内存,这样看来,内存泄露并没有什么可怕的。但是这只是针对短时间运行的程序,对于长时间运行的程序,比如,服务类程序,一直在后台运行,不停的消耗内存,如果有内存泄露问题,系统的可用内存也就会一直减少,直到系统再也无法分配内存给你用,这个时候,程序崩了,操作系统也会崩了,大部分时候,不到泄露完,系统就差不多蹦了。

5.内存管理的原则:

范围: 在oc中,主要针对继承了NSObject的对象,对基本数据类型无效。

2.)原理 -1.每个对象内部都保存了一个与之引用次数相关联的整数,称为引用计数器 -2.当使用alloc,new或者copy创建一个对象的时候,对象的引用计数器值被设置为1

-3.给对象发送一条retain消息,可以使引用计数 + 1 给对象发送一条release消息,可以使引用计数器值 -1

-4.当一个对象的引用计数值为0时,那么他将被销毁,其占用的内存被系统回收,系统也会自行向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealooc方法

-5.可以给对象发送retainCount消息获得当前的引用计数器值

6.内存管理的黄金法则:

1.谁创建,谁释放(谁污染,谁治理)如果你通过alloc,new或copy来创建了一个对象,那么你必须调用release或者autorelease去释放他。换句话说,不是你创建的,就不用你去释放。

2.一般来说,除了alloc,new,或copy之外的方法创建的对象都被声明了autorelease

3.谁retain,谁release。主要你调用了retain,无论这个对象是如何产生的,你都要调用release

7.在mrc内存管理中setter函数的写法:

  • (void)setBook:(Book *)book{ if (book != _book) { [_book release]; _book = [book retain]; } } //记得在dealloc中释放当前的book
  • (void)dealloc { [_book release]; [super dealloc]; }

这么写的主要原因是防止内存泄露

8.@property参数(retain)要注意的问题

原因同上,防止内存泄露。注要是要注意在dealloc函数中释放该对象

9.什么是自动释放池

自动释放池是OC里面的一种内存自动回收机制,一般可以将一些临时对象添加到自动释放池中,统一回收释放 当自动释放池销毁时,池里面的所有对象都会调用一次release方法

10.什么是autorelease?

autorelease 是系统提供给所有对象的一个方法,作用是将该对象发入到自动内存释放池中,因为对所有对象都能使用,估计是nsobjet里的东西,猜测。 原理: OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池) autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Release

11.什么时候autorelease?与releasee的区别

什么时候autorelease? 一般可以为类添加一个快速创建对象的静态方法

释放的时间。release是调用后,效果立竿见影,计数直接减1。 autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Release

12.autorelease pool疑问(延伸)

在iPhone项目中,main()中有一个默认的Autorelease Pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是Autorelease Pool里的所有对象在程序退出时才release,这样跟内存泄露有什么区别? 对于每一个Runloop, 系统会隐式创建一个Autorelease pool,并且把创建好的pool放在栈顶,所有的pool会构成一个栈式结构。在每一个Runloop结束时,当前栈顶的pool会被销毁,这样这个pool里的每个对象会执行release操作

收藏
1
sina weixin mail 回到顶部