static
static分两种情况,修饰局部
变量和全局
变量。
(1)修饰局部
变量
在整个程序运行的过程中局部变量只初始化一次
,只有一份内存
,作用域是该方法
或代码块
内。
#import "ViewController.h"
#import "NetManger.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
for(int i = 0;i<5;i++)
{
[self isNotStatic];
[self isStatic];
}
// Do any additional setup after loading the view.
}
-(void)isNotStatic
{
int i = 0;
I++;
NSLog(@"i====%d",i);
}
-(void)isStatic
{
static int j = 0;
j++;
NSLog(@"j====%d",j);
}
@end
控制台输出结果如下:
2020-10-19 20:25:06.755165+0800 id[2308:41315] i====1
2020-10-19 20:25:06.755291+0800 id[2308:41315] j====1
2020-10-19 20:25:06.755418+0800 id[2308:41315] i====1
2020-10-19 20:25:06.755501+0800 id[2308:41315] j====2
2020-10-19 20:25:06.755748+0800 id[2308:41315] i====1
2020-10-19 20:25:06.755860+0800 id[2308:41315] j====3
2020-10-19 20:25:06.756092+0800 id[2308:41315] i====1
2020-10-19 20:25:06.756172+0800 id[2308:41315] j====4
2020-10-19 20:25:06.756301+0800 id[2308:41315] i====1
2020-10-19 20:25:06.756495+0800 id[2308:41315] j====5
从输出结果看出,i一直
是1,而j每次都增加
1
在isNotStatic
方法中,每次都重新初始化一个全新的局部变量i,执行++后变为1,出了该方法即作用域后被释放回收,所以每次打印都是1.而在isStatic
方法中,由于局部变量j被关键字static
修饰,让局部变量只初始化一次,内存也只有一份(静态存储区
),在整个app运行期间都不会被释放回收。
(2)修饰全局
变量
作用域:仅限于当前
文件内部,外部文件无法访问,说白了就是在一个类里面定义一个static全局变量,其他类
是无法访问
的。
当全局
变量使用static
修饰后,生命周期没有
变,依旧是程序结束才销毁。但是作用域
变了,以前是整个
源程序,现在只限于
申明它的这个文件才能用,即使用extern
引用也不行,如下
const作用:限制类型
(1)const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)
(2)被const修饰的变量是只读的
举例如下:
//定义变量
int a = 10;
//允许修改值
a = 20;
/*
const两种用法,修饰基本变量和指针变量
*/
//1.修饰基本变量,下面两种写法等价
const int b = 20;//b:只读变量
int const bb = 20;//c:只读变量
//2.修饰指针变量*p,带*的变量,就是指针变量
//定义一个指向int类型的指针变量,指向a的地址
int *p = &a;
int c = 10;
p = &c;
//允许修改p指向的地址,
//允许修改p访问内存空间的值
*p=30;
//const修饰指针变量访问的内存空间,修饰的是右边的*p1
//两种方式等价
const int *p1;//*p1:常量,p1:变量
int const *p11;//*p11:常量,p11:变量
//const修饰指针变量p1
int *const p111;//*p111:变量 p111:常量
// 第一个const修饰*p1 第二个const修饰 p1
// 两种方式一样
const int * const p2; // *p2:常量 p2:常量
int const * const p22; // *p2:常量 p2:常量
归纳为下面四种情况:
int const *p // *p只读 ;p变量
int * const p // *p变量 ; p只读
const int * const p //p和*p都只读
int const * const p //p和*p都只读
总结:
判断p 和p是只读
还是变量
,关键是看const
在谁前面
。如果只
在p
前面,那么p
只读, *p
还是变量;如果在*p
前面,那么*p
只读 ,p
变量。
const开发使用场景:
-
当一个
方法参数
只读 -
定义
只读全局
变量#import "ViewController.h" #import "NetManger.h" @interface ViewController () @end @implementation ViewController NSString *const globalVar = @"123"; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } // 当一个方法的参数,只读. - (void)constTestWithStr:(NSString * const)name { } // 指针只读,不能通过指针修改值 - (void)constTestWithIntPointer:(int const *)a{ //*a = 10;错误写法 } // 基本数据类型只读 - (void)constTestWithInt:(int const)a{ } @end
网友评论