我們?cè)诳匆恍┐笈5牡谌綍r(shí),里面會(huì)出現(xiàn)很多const榴嗅、static和extern,尤其是const和static陶舞,const和extern的結(jié)合使用嗽测,直接令很多小伙伴懵逼了,今天就詳細(xì)講解一下這三個(gè)關(guān)鍵字的正確使用方式肿孵。
一唠粥、const
const的作用和宏是很類(lèi)似的,其實(shí)停做,蘋(píng)果是不推薦我們使用宏的晤愧,它更喜歡我們使用const,于是乎蛉腌,在swift中宏就被拋棄了官份,我們只能使用const。
在這里簡(jiǎn)單聊一下const和宏的區(qū)別:
1.編譯時(shí)刻? 宏:預(yù)編譯 const:編譯
2.編譯檢查? 宏沒(méi)有編譯檢查,不會(huì)報(bào)編譯錯(cuò)誤烙丛,只是替換舅巷;const有編譯檢查,會(huì)報(bào)編譯錯(cuò)誤
3.宏的好處? 宏能定義一些函數(shù)河咽,方法,但是const不可以
4.宏的壞處? 大量使用宏,會(huì)導(dǎo)致預(yù)編譯時(shí)間過(guò)長(zhǎng)钠右。
const有兩個(gè)作用:
1.修飾右邊的基本變量和指針變量;
2.被const修飾的變量只讀,也就是只能獲取,不能修改忘蟹。
const的使用場(chǎng)景:
1.修飾全局變量? ==>全局只讀變量? ==>? 代替宏
2.修飾方法中的參數(shù)
代碼如下:
NSString * const gender = @"gender";
[[NSUserDefaults standardUserDefaults] objectForKey:gender];
二飒房、static
static有兩個(gè)作用:
1.修飾局部變量:被static修飾的局部變量搁凸,可以延長(zhǎng)生命周期,生命周期跟整個(gè)應(yīng)用程序一致狠毯;被static修飾的局部變量坪仇,只會(huì)分配一次內(nèi)存。
代碼如下:
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event {
static int i = 0;
i++;
NSLog(@"%d", i);
}
2.修飾全局變量:被static修飾的全局變量垃你,作用域會(huì)修改椅文,生命周期不會(huì)改,只能在當(dāng)前文件下使用。
代碼如下:
static int m = 0;
三惜颇、extern
extern作用:聲明外部全局變量皆刺。
extern工作原理:先會(huì)去當(dāng)前文件下查找有沒(méi)有對(duì)應(yīng)全局變量,如果沒(méi)有,才會(huì)去其他文件查找。
四凌摄、static和const的結(jié)合使用
static,const結(jié)合使用的作用:聲明一個(gè)只讀的全局靜態(tài)變量羡蛾。
開(kāi)發(fā)使用場(chǎng)景:在一個(gè)文件中經(jīng)常使用的字符串常量,可以使用static與const組合锨亏。
代碼如下:
static NSString * const name = @"name";
[[NSUserDefaults standardUserDefaults] setObject:@"123" forKey:name];
五痴怨、extern和const的結(jié)合使用
使用場(chǎng)景:在多個(gè)文件中經(jīng)常使用的同一個(gè)字符串常量,可以使用extern與const組合器予。
開(kāi)發(fā)時(shí)有個(gè)規(guī)定浪藻,為了避免重復(fù)報(bào)錯(cuò),全局變量不能定義在自己的類(lèi)中乾翔,我們需要自己創(chuàng)建一個(gè)全局文件管理全局東西爱葵。
創(chuàng)建一個(gè)全局類(lèi)GlobelConst。
代碼如下:
#import<Foundation/Foundation.h>
extern NSString * const discover_name;
extern NSString * const home_name;
#import "GlobelConst.h"
//定義整個(gè)項(xiàng)目中的全局變量
/**********? 發(fā)現(xiàn)模塊? **********/
NSString * const discover_name = @"name";
/**********? 首頁(yè)模塊? **********/
NSString * const home_name = @"name";
[[NSUserDefaults standardUserDefaults] setObject:@"123" forKey:discover_name];
[[NSUserDefaults standardUserDefaults] objectForKey:discover_name];