OC内存管理是通过管理对象的引用计数来实现,其规则为:谁创建谁释放,谁引用(retain)谁管理。
管理方式分两种:ARC(自动引用计数)、MRC(手动引用计数),下面就这两种方式进行叙述:
1、ARC
Automatic Reference Counting(自动引用计数)
ARC环境下变量修饰符有__strong、__weak、__unsafe_unretained(1)__strong,对象不指定修饰词的话默认为__strong,强引用指向的对象不会被释放,局部对象直到方法结束后才释放。
(2)没有强指针指向的对象会立即释放,即__weak修饰的对象若没有用__strong修饰,则刚创建就会被释放。
(3)__weak修饰的对象释放后,__weak指针自动置为nil。
(4)__weak修饰的对象不论局部还是全局,均是刚创建就会被释放。
(5)在ARC中判断对象是否会被释放,就看是否有__strong指针指向,有则不会释放,没有则会释放。
(6)ARC中不会出现野指针(指向僵尸对象(不可用的内存)的指针),原因:对象若有强指针指向则不会释放也不会成为僵尸对象,若没有强指针指向,则释放该对象,同时将__weak指针置空,因此也不会出现野指针。
(7)在ARC情况下,在@property时可以使用retain,只是编译时会自动将其转成__strong。
(8)本类对象释放时 系统自动释放全局对象。
(9)__weak的存在是为了解决内存泄露问题。(两个对象相互引用,则其中一个使用__weak可避免循环引用)。
2、MRC
Manual Reference Counting(手动引用计数)
学会手动管理内存,需要知道OC中哪些关键字会让对象的引用计数发生变化,如下:向对象发送以下消息会让对象的引用计数加1:
alloc、new、retain、addSubview、addObject、push(这里不止加1,加的数值不确定。)等。
向对象发送以下消息会让对象的引用计数减1:
注:alloc/new与release/autorelease应成对出现。
知道了这些规则,MRC的核心你就基本掌握了。