1.局部变量
概念
局部变量就是定义在函数, 代码块和函数形参列表中的变量, 我们就称之为局部变量
作用范围
从定义的那一行开始一直直到遇到大括号结束或者遇到return为止
特点:
相同作用域范围内不能出现同名的局部变量
不同作用域范围内出现同名的局部变量, 内部的局部变量会覆盖外部的局部变量
注意:
局部变量没有固定的初始化值, 如果没有对局部变量进行初始化, 那么局部变量中是一些随机的值, 所以在开发中千万不要使用未初始化的局部变量
存储位置:
局部变量存储在栈中, 当作用域结束系统会自动释放栈中的局部变量
2.全局变量
概念
写在函数,代码块,形参列表外的变量, 我们就称之为全局变量
作用范围: 从定义的那一行开始一直直到文件末尾(暂时这样认为)
特点
全局变量和局部变量可以同名
如果存在和全局变量同名的局部变量, 那么局部变量会覆盖全局变量
注意:
全局变量如果没有进行初始化, 那么系统默认会将全局变量初始化为0
存储位置:
全局变量存储在静态区中, 他会随着程序的启动而创建, 随着程序的结束而结束
3.内部全局变量和外部全局变量
(1)全局变量分为两种:
1)外部全局变量, 默认情况下所有的全局变量都是外部全局变量
什么是外部全局变量? 可以被其它文件访问的全局变量我们称之为外部全局变量
2)内部全局变量, 只要给全局变量加上static关键字就是内部全局变量
什么是内部全局变量? 只能被当前文件访问的全局变量我们称之为内部全局变量
(2) 外部全局变量有一个特点:
可以定义同名的外部全局变量
多个同名的外部全局变量指向同一块存储空间
内部全局变量有一个特点
也可以定义多个同名的内部全局变量
多个同名的全局变量如果不在同一个文件中, 那么指向不同的存储空间
(3)static
为了提高数据的安全性, 不让别人在其它文件中修改我们的全局变量,
C语言提供了另外一个用于修改全局变量的关键字, static
只要用static修改的全局变量就是内部全局变量, 只能在当前文件中使用
这样就可以提高我们全局变量的安全性
如果多个文件中存在同名的内部全局变量, 相互不会影响
如果既有外部全局变量也有内部全局变量, 那么会优先访问内部全局变量
extern:
用于声明一个外部全局变量
声明只需要在使用变量之前声明就可以了
static:
用于定义一个内部全局变量
(4)声明和定义的区别:
声明不会开辟存储空间
定义会开辟存储空间
4.static对局部变量的作用
(1)当使用static来修饰局部变量, 那么会延长局部变量的生命周期, 并且会更改局部变量存储的位置 , 将局部变量从栈转移到静态区中
(2)只要使用static修改局部变量之后, 当执行到定义局部变量的代码就会分配存储空间, 但是只有程序结束才会释放该存储空间,静态区地址赋值后不能更改。
5.extern和static对函数的作用
(1)函数也分为内部函数和外部函数
默认情况下所有的函数都是外部函数
什么是外部函数? 可以被其它文件访问的函数称之为外部函数
什么是内部函数? 只能在当前文件中访问的函数称之为内部函数
(2) 只要在函数的返回值前面加上一个extern就可以让函数变为一个外部函数, 由于默认就是外部函数, 所以在开发中一般情况extern没人写
如果extern写在函数的实现中, 代表定义一个外部函数
如果extern写在函数的声明中, 代表声明一个外部函数
(3) 只要在函数的返回值前面加上static就可以让函数变为内部函数, 其它文件就不能访问了
如果static写在函数的实现中, 代表定义一个内部函数
如果static写在函数的声明中, 代表声明一个内部函数
5.const的用法
(1) const在指针中的用法
如果const写在指针类型的左边, 那么意味着指向的内存空间中的值不能改变, 但是指针的指向可以改变
如果const写在指针的数据类型和*号之间, 那么意味着指向的内存空间中的值不能改变, 但是指针的指向可以改变
如果const写在指针的右边(数据类型 * const), 那么意味着指针的指向不可以改变, 但是指针指向的存储空间中的值可以改变
const char *name = "lnj";
int const *p = #
int * const p = #
(2) const对基本数据类型的作用
const对基本数据类型的作用, 可以让基本数据类型的变量变为常量
const有两种写法, 1.写在数据类型的左边, 2.写在数据类型的右边
const int num = 10;
int const num = 10;
6.成员变量、全局变量和局部变量对比
(1)写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量)
成员变量只能通过对象来访问
注意: 成员变量不能离开类, 离开类之后就不是成员变量
成员变量不能在定义的同时进行初始化
存储: 堆(当前对象对应的堆的存储空间中)
存储在堆中的数据, 不会被自动释放, 只能程序员手动释放,或者等对象释放的时候,它也会释放
(2)写在函数和大括号外部的变量, 我们称之为全局变量
作用域: 从定义的那一行开始, 一直到文件末尾
局部变量可以先定义在初始化, 也可以定义的同时初始化
存储: 静态区
程序一启动就会分配存储空间, 直到程序结束才会释放
(3)写在函数或者代码块中的变量, 我们称之为局部变量
作用域: 从定义的那一行开始, 一直到遇到大括号或者return
局部变量可以先定义再初始化, 也可以定义的同时初始化
存储 : 栈
存储在栈中的数据有一个特点, 系统会自动给我们释放
7.iOS中全局变量的几种使用方法
(1)在AppDelegate中声明并初始话全局变量
在需要使用的地方插入以下代码,在ios中 AppDelegate被设计成了单例模式
AppDelegate *appDelegate = [[UIApplication shareApplication] delegate];
appDelegae.your_var
(2)使用extern关键字,extern可以理解为外部引入的意思
1、单独新建一个example.h文件,文件名自己取,用于存放所有的全局变量
2、在该文件中写入你要定义的变量名,定义时不能初始化,如:
NSString *str;
int number;
3、在需要使用的地方引入头文件
#import "example.h"
4、给全局变量初始化或者赋值
extern NSString *str = [[NSString alloc] initWithFormat:@"abcd"];
extern int number = 1;
(3)使用单例
interface Singleton : NSObject
+ (Singleton *)sharedSingleton;
@property (nonatomic,copy) NSString *testGlobal;
@end
@implementation Singleton
+ (Singleton *)sharedSingleton
{
static Singleton *sharedSingleton;
@synchronized(self)
{
if (!sharedSingleton)
sharedSingleton = [[Singleton alloc] init];
return sharedSingleton;
}
}
@end
使用如:
[Singleton sharedSingleton].testGlobal = @"test";