正確使用const,static,extern

一岳链、const與宏的區(qū)別:

const簡介:之前常用的字符串常量弄跌,一般是抽成宏,但是蘋果不推薦我們抽成宏峭沦,推薦我們使用const常量。

編譯時刻:宏是預編譯(編譯之前處理)征炼,const是編譯階段析既。

編譯檢查:宏不做檢查,不會報編譯錯誤谆奥,只是替換眼坏,const會編譯檢查,會報編譯錯誤酸些。

宏的好處:宏能定義一些函數宰译,方法。 const不能魄懂。

宏的壞處:使用大量宏沿侈,容易造成編譯時間久,每次都需要重新替換市栗。

注意:很多Blog都說使用宏缀拭,會消耗很多內存,我這驗證并不會生成很多內存填帽,宏定義的是常量蛛淋,常量都放在常量區(qū),只會生成一份內存篡腌。

// 常見的常量:抽成宏

#define ZSAccount @"account"

#define ZSUserDefault [NSUserDefaults standardUserDefaults]

// 字符串常量

staticNSString*constaccount =@"account";

- (void)viewDidLoad {??

[super? viewDidLoad];

// 偏好設置存儲

// 使用宏

[ZSUserDefault setValue:@"123"forKey:ZSAccount];

// 使用const常量

[[NSUserDefaults standardUserDefaults] setValue:@"123"forKey:account];

}

二褐荷、const作用:限制類型

1.const僅僅用來修飾右邊的變量(基本數據變量p,指針變量*p)

2.被const修飾的變量是只讀的嘹悼。

const基本使用

- (void)viewDidLoad {

? [super viewDidLoad];

// 定義變量

int a =1;

// 允許修改值

a =20;

// const兩種用法

// const:修飾基本變量p

// 這兩種寫法是一樣的叛甫,const只修飾右邊的基本變量b

const int b =20; // b:只讀變量

int const b =20;// b:只讀變量

// 不允許修改值b =1;

// const:修飾指針變量*p,帶*的變量绘迁,就是指針變量.

// 定義一個指向int類型的指針變量合溺,指向a的地址

int*p = &a;

intc =10;??

p = &c;

// 允許修改p指向的地址,

// 允許修改p訪問內存空間的值

*p =20;

// const修飾指針變量訪問的內存空間缀台,修飾的是右邊*p1,

// 兩種方式一樣constint*p1;

// *p1:常量 p1:變量

int const*p1;// *p1:常量 p1:變量

// const修飾指針變量p1

int*const p1;? // *p1:變量 p1:常量

// 第一個const修飾*p1 第二個const修飾 p1

// 兩種方式一樣

const int *const p1;// *p1:常量 p1:常量

int const *const p1;// *p1:常量 p1:常量

}

三哮奇、const開發(fā)中使用場景:

1.需求1:提供一個方法膛腐,這個方法的參數是地址,里面只能通過地址讀取值,不能通過地址修改值

2.需求2:提供一個方法鼎俘,這個方法的參數是地址哲身,里面不能修改參數的地址。

@implementationViewController

// const放*前面約束參數贸伐,表示*a只讀

// 只能修改地址a,不能通過a修改訪問的內存空間

- (void)test:(const int* )a{

//? ? *a = 20;

}

// const放*后面約束參數勘天,表示a只讀

// 不能修改a的地址,只能修改a訪問的值

- (void)test1:(int*const)a{

int b;?

// 會報錯

a = &b;??

*a =2;

}

- (void)viewDidLoad {

? [super? viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

int a =10;

// 需求1:提供一個方法,這個方法的參數是地址脯丝,里面只能通過地址讀取值,不能通過地址修改值商膊。

// 這時候就需要使用const,約束方法的參數只讀.

[self? test:&a];

// 需求2:提供一個方法宠进,這個方法的參數是地址晕拆,里面不能修改參數的地址。

[self test1:&a];

}

@end

四材蹬、static和extern簡單使用

static作用:

修飾局部變量:

1.延長局部變量的生命周期,程序結束才會銷毀实幕。

2.局部變量只會生成一份內存,只會初始化一次。

3.改變局部變量的作用域堤器。

修飾全局變量

1.只能在本文件中訪問,修改全局變量的作用域,生命周期不會改

2.避免重復定義全局變量

extern作用:

只是用來獲取全局變量(包括全局靜態(tài)變量)的值昆庇,不能用于定義變量

extern工作原理:

先在當前文件查找有沒有全局變量,沒有找到闸溃,才會去其他文件查找凰锡。

// 全局變量:只有一份內存,所有文件共享圈暗,與extern聯(lián)合使用掂为。

int a =20;

// static修飾全局變量

static int age =20;

- (void)test{

// static修飾局部變量

static int age =0;??

age++;

NSLog(@"%d",age);

}

- (void)viewDidLoad {?

? [super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

[self test];??

[self test];

extern int age;

NSLog(@"%d",age);

}

五、static與const聯(lián)合使用

static與const作用:聲明一個只讀的靜態(tài)變量

開發(fā)使用場景:在一個文件中經常使用的字符串常量员串,可以使用static與const組合

// 開發(fā)中常用static修飾全局變量,只改變作用域

// 為什么要改變全局變量作用域勇哗,防止重復聲明全局變量。

// 開發(fā)中聲明的全局變量寸齐,有些不希望外界改動欲诺,只允許讀取。

// 比如一個基本數據類型不希望別人改動// 聲明一個靜態(tài)的全局只讀常量

staticconstinta =20;

// staic和const聯(lián)合的作用:聲明一個靜態(tài)的全局只讀常量

// iOS中staic和const常用使用場景渺鹦,是用來代替宏扰法,把一個經常使用的字符串常量,定義成靜態(tài)全局只讀變量.

// 開發(fā)中經常拿到key修改值毅厚,因此用const修飾key,表示key只讀塞颁,不允許修改。

static NSString *const key =@"name";

// 如果 const修飾 *key1,表示*key1只讀吸耿,key1還是能改變祠锣。

static NSString const *key1 = @"name";

六、extern與const聯(lián)合使用

開發(fā)中使用場景:在多個文件中經常使用的同一個字符串常量咽安,可以使用extern與const組合伴网。

原因:

static與const組合:在每個文件都需要定義一份靜態(tài)全局變量。

extern與const組合:只需要定義一份全局變量妆棒,多個文件共享澡腾。

全局常量正規(guī)寫法:開發(fā)中便于管理所有的全局變量沸伏,通常搞一個GlobeConst文件,里面專門定義全局變量动分,統(tǒng)一管理毅糟,要不然項目文件多不好找。

Const.h

extern NSString *constName = @"name";

Const.m

#import <Foundation/Fondation.h>

NSString *constName = @"name";

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末刺啦,一起剝皮案震驚了整個濱河市留特,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玛瘸,老刑警劉巖蜕青,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糊渊,居然都是意外死亡右核,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門渺绒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贺喝,“玉大人,你說我怎么就攤上這事宗兼□镉悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵殷绍,是天一觀的道長染苛。 經常有香客問我,道長主到,這世上最難降的妖魔是什么茶行? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮登钥,結果婚禮上畔师,老公的妹妹穿的比我還像新娘。我一直安慰自己牧牢,他們只是感情好看锉,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著结执,像睡著了一般度陆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上献幔,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音趾诗,去河邊找鬼蜡感。 笑死蹬蚁,一個胖子當著我的面吹牛,可吹牛的內容都是我干的郑兴。 我是一名探鬼主播犀斋,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼情连!你這毒婦竟也來了叽粹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤却舀,失蹤者是張志新(化名)和其女友劉穎虫几,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體挽拔,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡辆脸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了螃诅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啡氢。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖术裸,靈堂內的尸體忽然破棺而出倘是,到底是詐尸還是另有隱情,我是刑警寧澤袭艺,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布搀崭,位于F島的核電站,受9級特大地震影響匹表,放射性物質發(fā)生泄漏门坷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一袍镀、第九天 我趴在偏房一處隱蔽的房頂上張望默蚌。 院中可真熱鬧,春花似錦苇羡、人聲如沸绸吸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锦茁。三九已至,卻和暖如春叉存,著一層夾襖步出監(jiān)牢的瞬間码俩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工歼捏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稿存,地道東北人笨篷。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像瓣履,于是被迫代替她去往敵國和親率翅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容