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消息时,位于栈顶的先出栈。
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消息时,位于栈顶的先出栈。
野指针异常:现象:可能会崩溃,也可能不会崩溃,写到某一行代码时突然崩溃.(没有写任何和引用计数相关的代码)
产生原因:该对象的空间已经被系统回收,不能访问没有所有权的对象.
解决方案:空间被系统回收之后,禁止访问.