根据储存位置不同,可以分为,静态变量(静态储存区),动态变量(运行时堆栈),寄存器变量(寄存器)
静态变量(静态储存区):全局变量和使用static声明的局部变量都是静态变量,在系统运行过程中只初始化一次。#include <stdio.h>
int a=1; //全局变量存储在静态内存中,只初始化一次 void showMessage(){ static int b=1; //静态变量存储在静态内存中,第二次调用不会再进行初始化 int c=1; ++b; a+=2; printf("a=%d,b=%d,c=%d\n",a,b,c); } int main(int argc, const char * argv[]) { showMessage(); //结果:a=3,b=2,c=1 showMessage(); //结果:a=5,b=3,c=1 return 0; }
解释:
全局变量,作用域在自己的类里,类实现的各处均可调用。储存在静态区
局部变量,作用域在一个方法里,方法结束,变量销毁。储存在动态区,储存在栈中。
自动变量;不含有static的局部变量,储存在栈中。
static修饰的变量;静态变量,作用域为本类(如果其他类调用该变量的同名变量,不会报错。)修饰函数,为内部函数,外部调用会报错。
extern修饰的变量:申明一个已经存在的变量,只是声明,没有初始化。extern修饰函数,是声明和定义函数为外部函数,可以省略,所以所有的函数都默认为外部函数。
单例是全局变量,因为单例在整个程序运行期间只被创建初始化一次,因此单例只保存一个对象,如果在A类中创建单例,那么在B类中再次创建单例的话,单例仍然保持着A类中得对象,单例对象的各种状态就依然保存着A类运行之后的状态。(比如一个播放器对象Player,是一个单例,你在A类中设置Player.playing = YES;之后跳转到B类,再次创建Player对象,Player.playing属性仍然是YES,不会因为重新创建而默认为nil);
重载就是重新加载,就是重新alloc。
最后做一下简单总结一下:
原文:http://www.cnblogs.com/rankilau/p/4375157.html