1.说一说对内存管理的理解?(原理)
iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有另外一个对象或指针指向这块内存,那么为了表示这个后来的对象或指针对这块内存的所有权,引用计数加1变为2,之后若有一个对象或指针不再指向这块内存时,引用计数减1,表示这个对象或指针不再拥有这块内存的所有权,当一块内存的引用计数变为0,表示没有任何对象或指针持有这块内存,系统便会立刻释放掉这块内存。
其中在开发时引用计数又分为ARC(自动内存管理)和MRC(手动内存管理)。ARC的本质其实就是MRC,只不过是系统帮助开发者管理已创建的对象或内存空间,自动在系统认为合适的时间和地点释放掉已经失去作用的内存空间,原理是一样的。虽然ARC操作起来很方便,不但减少了代码量,而且降低了内存出错的概率,但因为ARC不一定会及时释放,所以程序有时候可能会占用内存较大。而MRC若做得好,通过手动管理,及时释放掉不需要的内存空间,便可保证程序长时间运行在良好状态上。
2.内存管理的原则?
谁创建,谁释放,谁+1,谁-1
3.为什么需要内存管理?
内存管理的两大问题:内存泄露(没有释放)和野指针(没有使用或者置空)
4.autoreleasePool和autorelease的作用?
AutoreleasePool(自动释放池)是OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量release的时机。在正常情况下,创建的变量会在超出其作用域的时候release,但是如果将变量加入AutoreleasePool,那么release将延迟执行。
看到这里有人可能会问,那到底延迟到什么时候执行呢?看完本文后,各位心中自然会有答案。
autorelease可以将变量加入autoreleasePool
5.MRC中符合内存管理的set方法的书写
(旧值release,新值retain,赋值)
if (car != _car) {
// 对当前正在使用的变量)做一次release
[_car release];
// 对新车做一次retain,赋值
_car = [car retain];
}
6.属性修饰符
7.什么时候使用autorelease?与release的区别
以下三种情况需要使用autorelease
a.写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
b.写循环,循环里面包含了大量临时创建的对象。
c.创建了新的线程。(非Cocoa程序创建线程时才需要)
release会释放掉该对象
autorelease会将对象加入到autoreleasePool中,延迟释放。
8.什么是自动释放池?
9.什么是ARC?MRC?