關鍵字const/static/extern/typedef/typeof/define的釋義和用法

1、const(常量---readonly)

作用:
  • 用于修飾 右邊 的基本變量或指針變量;
  • 被修飾的變量只讀,不能被修改(readonly);
定義的意義:

(1.) 常用使用方式:

  • 常用單獨使用形式有三種:(但是一般會和其他關鍵字聯(lián)合使用)
const NSString * name = @"jack";
NSString const * sax = @"boy";
NSString * const age = @"24";

這樣定義的均為全局常量:不管你定義在那個文件夾(單獨定義現(xiàn)在只能存在于.m文件中,見:用法舉例->PS),在外部的任意文件中都可以訪問到。

  • 和其他關鍵字結合使用的形式一般有兩種:
extern const NSString * name; // 僅做聲明使用,一般存在與.h文件中
static const NSString * name = @"jack"; // 使全局常量變?yōu)榫植孔兞浚唧w使用后面會介紹??

(2.)const究竟做了什么?
在介紹const時著重強調了“右邊”二字,這是有原因的O(∩_∩)O~
在使用時我們發(fā)現(xiàn)const 修飾時 位置是不一樣的,不同位置分別代表了什么含義呢?

const NSString * name = @"jack";
// *name 不能修改  name 可以修改  ---> *name 是指向指針的指針~
NSString const * sax = @"boy";
// 與上面一樣(這就是為什么強調“右邊”二字了)
NSString * const age = @"24";
// *name 能修改  name 不可以修改  --->所以我們想定義一個不想被修改的常量應該這樣

我們可以用指針變量來驗證一下:


1-1-驗證
用法舉例:

訪問的方式一般有兩種:
(1.)在.m文件中定義,在其他文件中獲取其聲明,然后使用;


1-1-定義
1-1-使用

(2.)另一種使用時需要先在.h中聲明,然后.m中賦值,當要使用該常量時需要導入定義該常量的頭文件,然后直接使用即可。

1-1-聲明
1-1-定義
1-1-使用

PS:現(xiàn)在不能直接在.h文件中定義常量了,會發(fā)生循環(huán)引用問題。具體見http://www.lxweimin.com/p/94ca52399ade該篇文章的第十五小標題,所以現(xiàn)在常用方法是單獨創(chuàng)建一個專門存放常量的文件,使用第二種方法定義常量,然后在pch文件中導入該文件的頭文件。

2、static (靜態(tài)的)

作用:修飾不同的變量作用不盡相同。

(1.)修飾全局變量:

static NSString * name_boy = @"Bob";
// 下面是與const結合使用的情況
static const NSString * name = @"jack";
static NSString const * sax = @"boy";
static NSString * const age = @"24";

這又分為兩種:

---》在.h中修飾全局變量:

現(xiàn)在直接在.h文件中定義全局變量或者const修飾的全局變量運行時會直接報_x86的錯誤,但是可以使用static 修飾,即可在.h文件中定義,然后在其他文件中可以直接使用!

2-1-定義
2-1-使用
---》在.m中修飾全局變量:

改變全局變量的作用域,使全局變量的作用域僅限于當前文件內部(.m內部),即當前文件內部才能訪問該全局變量。同時這樣能夠避免重復定義全局變量!常見的使用情況:單例中。

若將上圖(2-1-定義)中static const NSString * name = @"jack";放到.m文件中則在AppDelegate.m中則訪問不到name.

2-1-驗證

(2.)修飾局部變量:
---》改變局部變量的生命周期(只到程序結束,這個局部變量才會銷毀)不會改變局部變量的作用域;
---》讓局部變量只初始化一次,局部變量在程序中只有一份內存

下面有一組對比來說明修飾局部變量后的變化:

正常情況下,未被static修飾的局部變量
使用static修飾的局部變量

可以看到,經(jīng)過static修飾后,在for循環(huán)內部workDays只被初始化了一次。

與const結合使用:

一般是在.m文件中定義經(jīng)常使用的字符串常量,或者數(shù)值常量時使用。static將一個全局變量變成局部變量,然后const將一個局部變量變成局部常量

e.g : MBProgressHUD.m中


3、extern(外部的,外部變量)

作用:
  • 用來聲明全局變量;
  • 只是用來獲取全局變量(包括全局靜態(tài)變量)的值,不能用于定義變量;
用法:
  • 在.h中修飾聲明全局變量,然后在.m中定義該全局變量,則在其他文件中可以直接使用該變量!
3-1-聲明
3-2-定義
3-3-使用
  • 獲取全局變量的值(具體用法參考本篇文章中const篇幅中 -> 用法舉例 中的(1.);
與const結合使用:

即,在.h中聲明一個const修飾的全局變量,讓后再在.m中實現(xiàn)其定義。(這樣逼格看起來要高一些,其實就是定義了一個全局變量~

在這里還有一些關鍵字UIKIT_EXTERN、OBJC_EXTERN、FOUNDATION_EXTERN、FOUNDATION_EXPORT、FOUNDATION_IMPORT,這些均為經(jīng)過處理的extern.

  • UIKIT_EXTERN:將函數(shù)/變量修飾為兼容以C編譯方式的、具有extern屬性的屬性。
  • OBJC_EXTERN:與UIKIT_EXTERN差不多,但是比其更加寬泛一些。
  • FOUNDATION_EXTERN:看其定義是與OBJC_EXTERN一毛一樣的······
  • FOUNDATION_EXPORT/FOUNDATION_IMPORT:用來兼容win32應用程序,同時也是為了兼容C++語言的~~(不明覺厲??)

若是使用以上字段是不是看起來逼格又高了一點~~,不過通常使用最多的也就是 UIKIT_EXTERN了。

4、typedef(定義類型)

作用:定義類型的別名。

(1.)定義枚舉:

typedef NS_ENUM(NSInteger, UITableViewStyle) {
    UITableViewStylePlain,          
    UITableViewStyleGrouped      
};

typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
    UISwipeGestureRecognizerDirectionRight = 1 << 0,
    UISwipeGestureRecognizerDirectionLeft  = 1 << 1,
    UISwipeGestureRecognizerDirectionUp    = 1 << 2,
    UISwipeGestureRecognizerDirectionDown  = 1 << 3
};
//凡是需要以按位或操作來組合的枚舉都應使用NS_OPTIONS定義。若是枚舉不需要互相組合,則應使用NS_ENUM來定義

(2.)定義block:

typedef void (^JRNetWorkSuccessBlock)(id responseObject, MBProgressHUD * hud);

(3.)添加別名:

typedef NSString Str;
// 這樣再定義string類型時,也可以直接使 Str
// e.g  @property (copy, nonatomic) Str * name;

5、typeof(變量名,類型)

作用:靜態(tài)獲取參數(shù)類型。

最常見就是自定義block中防止循環(huán)引用:

__weak typeof(self)weakSelf = self;
self.channelHeaderView.addAction = ^{
   [[UIApplication sharedApplication].keyWindow addSubview:weakSelf.channelView];
};

6、define(定義)

作用:主要是用于定義宏

關于宏定義可以看一下我的這篇文章 《iOS預編譯指令詳解》。對于經(jīng)常使用的一些常量最好使用const而不是定義成宏。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容