浅谈iOS中的全局变量和static全局变量

2018/10/17 posted in  iOS

场景:创建一个工具类,定义了一个静态全局变量,如何释放的问题?

在C语言里面,静态全局变量是存储在全局内存区(或是静态存储区),而且内存的分配是在程序运行前分配了,释放是在程序运行结束由系统自动释放,并不需要我们调用析构方法。那么OC开发中得全局静态变量也是一致的。 所以我们没有必要去管理我们的全局静态变量,在delloc方法里面也不需要去释放内存,因为系统会自动帮助我们释放静态变量。  

内存划分:

  • 栈区:内存管理由系统控制,存储的为非静态的局部变量,例如:函数参数,在函数中生命的对象的指针等。当系统的栈区大小不够分配时, 系统会提示栈溢出。
  • 堆区:内存管理由程序控制,存储的为malloc , new ,alloc出来的对象。 如果程序没有控制释放,那么在程序结束时,由系统释放。但在程序运行过程中,会出现内存泄露、内存溢出问题。分配方式类似于链表
  • 全局存储区(静态存储区):全局变量、静态变量会存储在此区域。事实上全局变量也是静态的,因此,也叫全局静态存储区。 存储方式: 初始化的全局变量跟静态变量放在一片区域,未初始化的全局变量与静态变量放在相邻的另一片区域。
    程序结束后由系统释放。
  • 文字常量区:在程序中使用的常量存储在此区域。程序结束后,由系统释放。在程序中使用的常量,都会到文字常量区获取。
  • 程序代码区:存放函数体的二进制代码。 运行程序就是执行代码,代码要执行就要加载进内存。

全局变量与全局静态变量的区别:

  • (a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
  • (b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
  • (c)具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用。

静态全局变量的作用:

  • (a)不必担心其它源文件使用相同变量名,彼此相互独立。
  • (b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
  • (c) 只能在本文件中使用!具有内部链接的静态;不允许在其他文件里调用。