static
static分兩種情況窖铡,修飾局部
變量和全局
變量。
(1)修飾局部
變量
在整個(gè)程序運(yùn)行的過(guò)程中局部變量只初始化一次
坊谁,只有一份內(nèi)存
万伤,作用域是該方法
或代碼塊
內(nèi)。
#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
控制臺(tái)輸出結(jié)果如下:
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
從輸出結(jié)果看出呜袁,i一直
是1敌买,而j每次都增加
1
在isNotStatic
方法中,每次都重新初始化一個(gè)全新的局部變量i阶界,執(zhí)行++后變?yōu)?虹钮,出了該方法即作用域后被釋放回收,所以每次打印都是1.而在isStatic
方法中膘融,由于局部變量j被關(guān)鍵字static
修飾芙粱,讓局部變量只初始化一次,內(nèi)存也只有一份(靜態(tài)存儲(chǔ)區(qū)
)氧映,在整個(gè)app運(yùn)行期間都不會(huì)被釋放回收春畔。
(2)修飾全局
變量
作用域:僅限于當(dāng)前
文件內(nèi)部,外部文件無(wú)法訪(fǎng)問(wèn),說(shuō)白了就是在一個(gè)類(lèi)里面定義一個(gè)static全局變量律姨,其他類(lèi)
是無(wú)法訪(fǎng)問(wèn)
的振峻。
當(dāng)全局
變量使用static
修飾后,生命周期沒(méi)有
變择份,依舊是程序結(jié)束才銷(xiāo)毀扣孟。但是作用域
變了,以前是整個(gè)
源程序荣赶,現(xiàn)在只限于
申明它的這個(gè)文件才能用凤价,即使用extern
引用也不行,如下
const作用:限制類(lèi)型
(1)const僅僅用來(lái)修飾右邊的變量(基本數(shù)據(jù)變量p拔创,指針變量*p)
(2)被const修飾的變量是只讀的
舉例如下:
//定義變量
int a = 10;
//允許修改值
a = 20;
/*
const兩種用法利诺,修飾基本變量和指針變量
*/
//1.修飾基本變量,下面兩種寫(xiě)法等價(jià)
const int b = 20;//b:只讀變量
int const bb = 20;//c:只讀變量
//2.修飾指針變量*p,帶*的變量剩燥,就是指針變量
//定義一個(gè)指向int類(lèi)型的指針變量慢逾,指向a的地址
int *p = &a;
int c = 10;
p = &c;
//允許修改p指向的地址,
//允許修改p訪(fǎng)問(wèn)內(nèi)存空間的值
*p=30;
//const修飾指針變量訪(fǎng)問(wèn)的內(nèi)存空間躏吊,修飾的是右邊的*p1
//兩種方式等價(jià)
const int *p1;//*p1:常量氛改,p1:變量
int const *p11;//*p11:常量,p11:變量
//const修飾指針變量p1
int *const p111;//*p111:變量 p111:常量
// 第一個(gè)const修飾*p1 第二個(gè)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都只讀
總結(jié):
判斷p 和p是只讀
還是變量
帐萎,關(guān)鍵是看const
在誰(shuí)前面
比伏。如果只
在p
前面,那么p
只讀, *p
還是變量疆导;如果在*p
前面,那么*p
只讀 赁项,p
變量。
const開(kāi)發(fā)使用場(chǎng)景:
當(dāng)一個(gè)
方法參數(shù)
只讀-
定義
只讀全局
變量#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. } // 當(dāng)一個(gè)方法的參數(shù)澈段,只讀. - (void)constTestWithStr:(NSString * const)name { } // 指針只讀,不能通過(guò)指針修改值 - (void)constTestWithIntPointer:(int const *)a{ //*a = 10;錯(cuò)誤寫(xiě)法 } // 基本數(shù)據(jù)類(lèi)型只讀 - (void)constTestWithInt:(int const)a{ } @end