看官们,我们在前面章回中介绍了OC中的KVO,本章回中将介绍OC中的内存管理。
内存管理涉及到了指针,内存分配和释放以及内存布局中的栈与堆,代码区等,这些内容与C语言相同,我们不做详细介绍。如果有看官不了解这些知识可以参考我在C语言专栏中写过的关于内存布局的博客。我们在本章回中主要介绍引用计数相关的内容。
在OC中每个对象都有一个整数与它关联,当有一个指针指向对象时,该整数的值加1,当指针不再指向对象时该整数值减1;当该整数值为0时系统会调用dealloc方法回收对象占用的内存,以免造成内存泄漏。这个整数叫作引用计数器,使用它管理对象使用内存的过程叫引用计数原理。其实这和C++中的引用计数原理相同,如果大家有C++基础的话很容易理解此过程。
在引用计数原理中可以引起引用计数器变化的对象(通常是指针)就是强引用,反之就是弱引用。弱引用会随着对象的生命周期结束而结束。OC中引入弱引用主要是为了解决强引用循环导致内存泄漏的问题。我们可以通过strong和weak来指定对象是强引用还是弱引用,如何指定呢?我们在后面章回中介绍。
在OC早期时,对象的引用计数是手动处理的,使用retain方法可以给对象的引用计数器加1,使用release方法可以给对象的引用计数器减1。写程序的时候手动管理对象的引用计数非常麻烦,而且还容易出错,因此苹果在iOS4之后引用了自动引用计数来解决此问题。此外,使用XCode开发应用程序时,它默认打开了自动引用计数的功能,当然也可以在设置中手动关闭自动引用计数功能,不过不建议这样做。XCode在4.2版本之后引入自动计数,低于此版本的不支持该功能,不过估计大家都不使用这么低版本的XCode了。关于手动引用计数,大家只需要了解一下手动引用计数的基本概念就可以了,毕竟现在写程序时已经不需要手动引用计数了。
刚才提到的自动引用计数也叫ARC,它是Automatic Reference Counting的缩写,它通过CLang编辑器自动管理对象的引用计数器,并且会自动释放对象占用的内存。我们现在写程序时只需要说明对象是强引用还是弱引用就可以,编译器会自动管理引用计数。我们在写程序时容易混淆ARC和autorelease块,认为二者是相同的东西,其实它们不一样。autorelease块的语法如下:
@autoreleasepool { //add your code }
我们如果想在ARC回收内存前释放掉某些对象的内存,那么可以把这些对象放到autorelease块中,当autorelease块结束时就会自动释放这些对象占用的内存,这种场景类似于Java中的匿名对象,使用完后很快就可以释放内存。我们在编写程序时可以依据程序的内容适当使用autorelease块。说了这么多二者到底有什么区别呢?autorelease块可以看作是ARC的一部分,它会让ARC提前释放部分对象的内存,但是它不能代表ARC。
最后我们对本章回的内容做一个总结:
看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解!