iOS的内存管理机制总结

纯原理的介绍资料太多,就不去copy他们了,还是记录一些自己在学习过程中的理解和总结沉淀,短但更有力!


首先区分清楚OC代码和C代码的内存机制是不同的:


C代码内存纯手工管理,自己申请自己要负责释放,原生是不支持引用计数的,也没有啥autoreleasepool,所以规则最简单,想玩的精是最难,如果你使用到C/C++代码,注意不要被OC的内存规则给“惯性思维”了。


OC代码内存总的原则:谁申请(包括retain),谁释放,引用计数最终平衡。 

OC代码又分MRC和ARC:


MRC:手动管理内存,早期代码都是这个模式,理解了这个模式有助于理解整个OC的内存机制,除了引用计数和autorelease的存在,其他机制和C/C++的基本一样。

ARC: 自动管理内存,新写的代码大多都支持ARC了,有人说有了ARC内存管理更简单了,我觉得不竟然,如果没有很好的理解原理,那么你的内存管理有可能一团糟,内存使用效率会非常差。


理解OC内存管理的关键是理解引用计数和autorelease:


引用计数:对象的内部保存一个数字,表示被引用的次数,使用alloc或者copy(或者new)方法创建一个对象时,其计数器的值为1,调用retain方法,引用次数就+1,调用releas方法就-1,当计数器到0的时候,系统会自动调用alloc方法来释放内存中的对象,需要注意的点就是:

  • alloc/new/copy 函数创建返回的对象,初始count都是1
  • retain/strong/copy 修饰的属性,赋值后指向的对象count+1
  • 养成良好习惯,使用引用release后,要把引用置nil,防止出现野指针

autorelease:就是系统自动释放内存, 可以简化内存管理代码,系统会自动释放autorelease池中的对象。但是,如果总是使用auterelease,也可能形成内存泄漏(释放延迟),问题在于autorelease池的释放时机,每当执行应用程序时,系统自动创建autorelease池,系统并不是立即释放autorelease池中的对象,而是在一个run loop之后才释放,一般是微秒级别,本来对象可以立即释放,但是系统很有可能过一些时候才释放autoreleae池中的对象,因此我们建议尽量自己进行内存管理,而不要太依赖autorelease。使用autorelease需要注意:

  • 除了alloc、new或copy之外的方法创建的对象都要被申明autorelease,当然你也可以手动retain来hold住这个对象,防止被马上释放掉。
  • autorelease的释放是延后的,如果一段同步代码中内存使用过大,需要自己创建autoreleasePool或者手动管理

针对ARC,还是有些注意点:

  • ARC是编译器在编译期间,将release自动添加到你的代码中的,不是运行时的机制,这点一定要注意,所以不要问系统什么时候会释放这块内存,这是由你自己代码直接决定的。
  • ARC对内存的管理记住两点:强引用指针置为nil或结束生命周期时会增加release,弱引用指针在内存释放时会被自动置为nil,所以不容易出现野指针。在不需要使用时尽快将指针置为nil,是内存有效使用的关键。
  • 在使用一些老的代码中,对于弱引用的修饰符是assign而不是week,这个时候就要注意了,ARC不会在内存释放的时候自动帮你置nil。

其他的一下注意事项:

  • MRC下,delegate对象使用week引用(弱引用),禁止使用strong或者retain(强引用),防止循环索引用(Instrument检查不出来)。Delegate对象释放时,在dealloc函数中一定要先将delegate置nil,再release使用delegate的这个对象,ARC下如果你是用assign修饰delegate对象,也要在手动将delegate引用置nil
  • 禁止调用NSObject的new方法,也不要在子类中重载
  • 不要用dealloc方法管理稀缺资源,比如文件、网络链接,因为如果crash,dealloc方法不一定能被调用到
  • MRC和ARC在block中使用与self相关的api时是需要注意的,使用不当会出现循环引用导致对象不释放(block中引用闭包外的指针,都是强引用)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iOS内存管理版本记录如下: 1. iOS 2.0及更早版本:使用手动管理内存的方式。 2. iOS 3.0:引入了基于引用计数的自动内存管理,使用retain和release函数来增加或减少对象的引用计数。 3. iOS 5.0:引入了ARC(自动引用计数)机制,ARC会在编译时自动插入retain和release代码,减少手动管理内存的工作。 4. iOS 7.0:引入了内存诊断工具Memory Usage Report,可以监测App内存使用情况,帮助开发者优化内存管理。 5. iOS 8.0:引入了一些新的API,如NSCache和NSURLSession,使得内存管理更加方便和灵活。 6. iOS 11.0:引入了基于图片大小的UIImage渲染机制,减少了内存占用。 7. iOS 13.0:引入了叫做“Scene”的多任务环境,使得内存管理更加复杂,需要更加小心谨慎地处理内存问题。 总的来说,随着iOS版本的不断更新,内存管理机制也在不断地完善和优化,使得iOS应用能够更加高效地使用内存,提高用户体验。 ### 回答2: iOS内存管理是由操作系统自动管理的,在不同的版本中有所不同。 在iOS 5之前的版本中,内存管理主要依赖于手动管理引用计数(reference counting)来管理对象的生命周期。开发者需要手动调用retain和release方法来增加或减少对象的引用计数,以确保对象在不再需要时能够被正确释放。这种方式需要开发者非常谨慎地管理对象的引用,以避免内存泄漏或野指针等问题。 从iOS 5开始,iOS引入了自动引用计数(Automatic Reference Counting,ARC)的内存管理机制。ARC可以自动地插入retain、release和autorelease等方法的调用,使得开发者不再需要手动进行内存管理。开发者只需要关注对象的创建和使用,而不需要关心具体的内存管理细节。ARC减少了内存管理的工作量,提高了开发效率,并且减少了内存泄漏和野指针等问题的发生。不过,ARC并不是完全的自动化内存管理,开发者仍然需要遵循一些规则,比如避免循环引用等,以保证内存的正确释放。 随着iOS版本的不断更新,苹果不断改进和优化内存管理机制。每个新版本都带来了更好的性能和更高效的内存管理。开发者可以通过关注苹果的官方文档和开发者社区中的更新内容来了解每个版本中的具体变化和改进。 总结来说,iOS内存管理从手动的引用计数到自动引用计数的演变,极大地简化了开发者的工作,并提高了应用的性能和稳定性。随着不断的改进和优化,iOS内存管理会越来越高效和可靠。 ### 回答3: iOS内存管理版本记录是指苹果公司在不同版本的iOS操作系统中对于内存管理方面的改进和更新记录。随着iOS版本的不断迭代,苹果在内存管理方面进行了一系列的优化和改进,以提高系统的稳定性和性能。 首先,在早期的iOS版本中,苹果采用了手动内存管理的方式,即开发人员需要手动创建和释放内存,容易出现内存泄漏和内存溢出等问题。为了解决这些问题,苹果在iOS5版本中引入了自动引用计数(ARC)机制。ARC机制能够通过编译器自动生成内存管理代码,避免了手动管理内存带来的问题。 其次,iOS6版本引入了内存分页机制。这个机制能够将应用程序内存分成不同的页,将不常用的页置于闲置列表中,从而释放出更多的内存空间。这些闲置列表中的页能够在需要时快速恢复到内存中,减少了内存压力。 此外,iOS7版本中进一步提升了内存管理的能力。苹果在这个版本中引入了内存压缩技术,将内存中的数据进行压缩,从而提高了内存利用率。此外,iOS7还引入了资源清理功能,可以自动清理不再使用的资源,释放内存空间。 最后,在iOS13版本中,苹果进一步改进了内存管理策略。该版本中引入了后台内存优化功能,能够自动优化应用在后台运行时的内存占用,减少了后台应用对于系统内存的占用和影响。 综上所述,iOS内存管理版本记录反映了苹果在不同版本的iOS操作系统中对于内存管理方面的改进和优化。这些改进和优化使得iOS系统更加稳定和高效,并且提升了应用程序的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值