OC之内存管理

本文深入探讨了iOS应用中常见的内存问题,包括内存溢出、野指针异常及内存过度释放,并介绍了内存管理的基本原则。文章还详细解释了alloc、retain、copy等操作及其对应的释放方法,以及NSAutoreleasePool的工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.内存管理的基本原则

iOS应用程序出现Crash(闪退), 90%以上的原因都是内存问题.

内存问题体现在两个方面:内存溢出,野指针异常,内存过度释放

了解内存管理,能帮助我们提升性能,大大减少调试bug时间.


垃圾回收 (gc);
MRC (Manual Reference Count, 人工引用计数) 遛狗原理 关灯原理
ARC(Auto Reference Count, 自动引用计数) 

+alloc  开辟一个新的空间,引用计数由0变为1
-retain 必须要有对象,计数+1
-copy 创建一个新的一样的对象,计数由0变为1
-release  引用计数-1
-autorelease 在将来的某一个时刻,引用计数-1. 如果内存之前引用计数为4,autorelease之后引用计数为4, 在将来的某个时刻会变为3



内存管理基本原则 : 如果你对一个对象进行 alloc, retain, copy 之后 , 你就拥有了该对象的所有权 , 你就必须对他进行 release 或者 autorelease.

NSAutoreleasePool的工作机制:
    当创建的对象未来某个时候销毁时,可以使用对象的autorelease方法。
    对象将所有权交给最近的NSAutoreleasePool对象。
    当autoreleasepool执行结束时,回向池内的对象发送release消息.

    autorelease的对象是延迟释放所有权。
    尽量不要使用autorelease,而是使用release。
    autorelease的对象将所有权交给最近的NSAutoreleasePool对象,这些autorelease的对象在自动释放池中有着自己的队列,同样遵循栈空间中先进后出的规律:先创建的对象相对位于栈底,当池对象给池中所拥有的对象逐一发送release消息时,位于栈顶的先出栈。 

野指针异常:现象:可能会崩溃,也可能不会崩溃,写到某一行代码时突然崩溃.(没有写任何和引用计数相关的代码)

产生原因:该对象的空间已经被系统回收,不能访问没有所有权的对象.

解决方案:空间被系统回收之后,禁止访问.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值