一、内存管理
内存问题体现在两个⽅⾯:内存溢出、野指针异常。1)iOS给每个应⽤程序提供了⼀定的内存,⽤于程序的运⾏。iPhone 3GS内存 30M左右,iPhone 5S 内存80M左右。⼀旦超出内存上限,程序就会Crash。2)对象内存空间已经被系统回收,仍然使⽤指针操作这块内存。野指 针异常是程序crash的主要原因。代码量越⼤的程序,越难找出出现 野指针的位置。
二、内存管理的⽅式
垃圾回收(gc) MRC(Manual Reference Count) ARC(Auto Reference Count) iOS中没有垃圾回收
垃圾回收:程序员只需要开辟内存空间,不需要⽤代码显⽰地释 放,系统来判断哪些空间不再被使⽤,并回收这些内存空间,以便再 次分配。整个回收的过程不需要写任何代码,由系统⾃动完成垃圾回 收。Java开发中⼀直使⽤的就是垃圾回收技术。
Manual Reference Count,⼈⼯引⽤计数:内存的开辟和释放都由 程序代码进⾏控制。相对垃圾回收来说,对内存的控制更加灵活,可 以在需要释放的时候及时释放,对程序员的要求较⾼,程序员要熟悉 内存管理的机制。
Auto Reference Count,⾃动引⽤计数:iOS 5.0的编译器特性,它 允许⽤户只开辟空间,不⽤去释放空间。它不是垃圾回收!它的本质 还是MRC,只是编译器帮程序员默认加了释放的代码。
iOS⽀持两种内存管理⽅式:ARC和MRC。 MRC的内存管理机制是:引⽤计数。 ARC是基于MRC的。
三、影响引⽤计数的⽅法
1、
alloc
方法的作用,开辟内存,并且将内存的引用计数由
0
变
1。
2、 retain方法的作用是让堆区内存的引用计数加1,是对原始内存进行持有 。
3、 copy方法的作用,在内存中开辟一块新的内存,将原内存中的内容拷贝一份赋值给新内存;copy没有让原内存的引用计数增加,而是让新内存的引用计数由0变1;
4、 release方法的作用是让内存的引用计数减1,当内存的引用计数由1变0时,内存会被系统回收
5、 autorelease方法的作用也是让内存的引用计数减1,但是不会马上减1,必须把autorelease写在一个自动释放池中,当自动释放池对象销毁时才真正的去执行减1;
// 将对象放到容器类对象中(数组、字典、集合),添加的对象的引用计数会加1;容器对象要对他的所有元素进行一次持有 ; 当容器对象销毁时,容器中的所有元素都会执行一次减1操作;