ios 内存管理的理解(一) 简述

1. 内存管理的范围
  • 所有的OC对象(继承自NSObject类)
    在这里插入图片描述
本质原因:是因为对象和其他数据类型在系统中的存储空间不一样,其他局部变量主要存放于栈中,而对象存储于堆中。
当代码块结束时,这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时,对象已经没有指针指向,但依然存在于内存中,就会造成内存泄露
2. 我们如何对OC对象进行内存管理?
  • 通过操作对象的"引用计数器"
3. 引用计数器
3.1 什么是引用计数器?
  • 1> 每个OC对象都有自己的引用计数器
  • 2> 它是一个整数(long类型, 占用8个字节)
  • 3> 从字面上, 可以理解为"对象被引用的次数"
  • 4> 也可以理解为: 它表示有多少人正在用这个对象
3.2 引用计数器的作用?
  • 系统通过"引用计数器"来判断当前对象是否可以被释放
    对象的"引用计数器"的操作方式
  • 1> retain, +1
  • 2> release, -1
  • 3> retainCount, 获取对象引用计数器的值
4. dealloc方法
  • 当对象即将被销毁, 系统自动给对象发送一条dealloc消息
  • 因此, 从dealloc方法有没有被调用,就可以判断出对象是否被销毁
  • 重写了dealloc方法, 必须调用[super dealloc],并且放在最后面调用,不要自己直接调用dealloc方法
5. 野指针\空指针\僵尸对象
  • 僵尸对象: 已经被销毁的对象(不能再使用的对象)
  • 野指针: 指向僵尸对象(不可用内存)的指针
  • 空指针: 没有指向存储空间的指针(里面存的是nil, 也就是0)
  • 注意: 给空指针发消息是没有任何反应的, 不会提示出错 nil Nil NULL [NSNULL null];
6. 多对象内存管理
set方法的内存管理
 -(void)setCar:(Car*)car{
    if( _car != car){
       [_car release];
       _car = [car retain];
    }
 }

  • dealloc方法的内存管理
-(void)dealloc{
   [_car release];
   [super dealloc];
}
7. 苹果官方的内存管理原则:
  • 谁创建谁release,
  • 如果你通过alloc、new或copy、mutableCopy来创建一个对象
  • 那么你必须调用release或autorelease
  • 谁retain谁release
  • 只要你调用了retain, 就必须调用一次release
8. @property的修饰关键字
1> 控制set方法的内存管理
  • retain: release旧值,retain新值(用于OC对象),要配合nonatomic使用
  • assign: 直接赋值,不做任何内存管理(默认,用于非OC对象类型)
  • copy: release旧值, copy新值(一般用于NSString *)
2>控制是否需要生成set方法
  • readwrite: 同时生成set方法和get方法(默认)
  • readonly: 只会生成get方法
3> 多线程管理
  • atomic: 性能低(默认)
  • nonatomic: 性能高(为iOS系统开发软件建议使用,为mac开发软件可以使用atomic)
4> 控制set方法和get方法的名称
  • setter: 设置set方法的名称, 一定有个冒号:
  • getter: 设置get方法的名称
9. @class用法
  • 为什么要使用@class .h
  • 通过@class解决循环依赖问题
10. 内存管理时的循环retain问题
  • 解决办法: 一端用retain、一端用assign
  • 注意: 使用了assign后, dealloc中就不需要release了
11.自动释放池简介
1.自动释放池的创建
  • 第一种
     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
     // 代码
     [pool release];  //[pool drain];用于mac
  • 第二种
@autoreleasepool
 {
   //开始代表创建自动释放池
 } //结束代表销毁自动释放池
2.自动释放池的好处
  • 不需要关心释放时间
  • 不需要关系什么时候release
3.autorelease基本用法
  • (1)会将对象放到一个自动释放池中
  • (2)当自动释放池被销毁时,会对池子里的所有对象做一次release
  • (3)会返回对象本身
  • (4)调用完autorelease方法后,对象的计数器不受影响(销毁时影响)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

早起的年轻人

创作源于分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值