iOS ——宏#define、const(static、extern)、枚舉enum

一、宏

宏的常見用法:
1、常見字符串抽成宏
2、常見代碼抽成宏

#define DEFINE @"Hello"
#define WIDTH 10.0
#define ZYXUserInstance [ZYXUser shareInstance]

二、const 常量

翻譯 const :常數(shù),不變的。
const是一個(gè)關(guān)鍵字。它限定一個(gè)變量不允許被改變,產(chǎn)生靜態(tài)作用。使用const在一定程度上可以提高程序的安全性和可靠性。
const修飾的數(shù)據(jù)類型是指常類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙桓碌摹?br> const 推出的初始目的,正是為了取代預(yù)編譯指令,消除它的缺點(diǎn),同時(shí)繼承它的優(yōu)點(diǎn)

三、const與宏的區(qū)別

1.1 宏在預(yù)編譯時(shí)處理(宏在編譯開始之前就會(huì)被替換)
const會(huì)在編譯時(shí)被處理
1.2 define宏沒有類型,宏不做任何類型檢查,不會(huì)報(bào)編譯錯(cuò)誤,只是替換
const常量有具體的類型,會(huì)編譯檢查,會(huì)報(bào)編譯錯(cuò)誤
1.3 宏的好處:宏能定義一些函數(shù),方法。
const不能;使用大量宏,容易造成編譯時(shí)間久,每次都需要重新替換
1.4 宏僅僅是展開,有多少地方使用,就展開多少次,不會(huì)分配內(nèi)存。(宏定義不分配內(nèi)存,變量定義分配內(nèi)存。)
 const常量會(huì)在內(nèi)存中分配(可以是堆中也可以是棧中)。
1.5 const 可以節(jié)省空間,避免不必要的內(nèi)存分配

const
#define PI 3.14159 //常量宏 const doulbe Pi=3.14159; //此時(shí)并未將Pi放入ROM中
double I=PI; //預(yù)編譯期間進(jìn)行宏替換,分配內(nèi)存 double i=Pi; //此時(shí)為Pi分配內(nèi)存,以后不再分配!
double J=PI; //再進(jìn)行宏替換,又一次分配內(nèi)存 double j=Pi; //沒有內(nèi)存分配

const定義常量從匯編的角度來看,只是給出了對(duì)應(yīng)的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在程序運(yùn)行過程中只有一份拷貝(因?yàn)槭侨值闹蛔x變量,存在靜態(tài)區(qū)),而 #define定義的常量在內(nèi)存中有若干個(gè)拷貝。
1.6 提高了效率。 編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯期間的常量,沒有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高。

2.1 const僅僅用來修飾右邊的變量
2.2 被const修飾的變量是只讀的
2.3 const簡(jiǎn)單使用

//全局變量,constString1地址不能修改,constString1值能修改
const NSString *constString1 = @"I am a const NSString * string";
//意義同上,無區(qū)別
NSString const *constString2 = @"I am a NSString const * string";
// stringConst 地址能修改,stringConst值不能修改
NSString * const stringConst = @"I am a NSString * const string";

constString1 跟constString2 無區(qū)別.
*左邊代表指針本身的類型信息,const表示這個(gè)指針指向的這個(gè)地址是不可變的
*右邊代表指針指向變量的可變性,即指針存儲(chǔ)的地址指向的內(nèi)存單元所存儲(chǔ)的變量的可變性

四、const與static和extern配合使用

1.static的作用 ——局部變量(只在文件內(nèi)部使用)
1.1 延長(zhǎng)局部變量的生命周期,程序結(jié)束才會(huì)銷毀
1.2 局部變量只會(huì)生成一份內(nèi)存,只會(huì)初始化一次
1.3 改變局部變量的作用域
1.4 只能在本文件中訪問,修改全局變量的作用域,生命周期不會(huì)改
1.5 避免重復(fù)定義全局變量

static NSString * const kConst = @"Hello";
static const CGFloat kWidth = 10.0;

2.extern的作用——全局變量(對(duì)外公開)
2.1 只是用來獲取全局變量(包括全局靜態(tài)變量)的值,不能用于定義變量
2.2 先在當(dāng)前文件查找有沒有全局變量,沒有找到,才會(huì)去其他文件查找
extern常用在.h聲明中
//Test.h
extern NSString * const CLASSNAMEconst;
//Test.m
NSString * const CLASSNAMEconst = @"hello";

五、enum枚舉類型

枚舉常量不會(huì)占用對(duì)象的存儲(chǔ)空間,它們?cè)诰幾g時(shí)被全部求值。枚舉常量的缺點(diǎn)是:它的隱含數(shù)據(jù)類型是整數(shù),其最大值有限,且不能表示浮點(diǎn)數(shù)(如PI=3.14159)。
typedef enum {
Third_None = -1,
Third_WEIXIN,
Third_QQ,Third_WEIBO
} ThirdType;

在iOS6和Mac OS 10.8以后Apple引入了兩個(gè)宏來重新定義這兩個(gè)枚舉類型,實(shí)際上是將enum定義和typedef合二為一,并且采用不同的宏來從代碼角度來區(qū)分。

NS_OPTIONS一般用來定義位移相關(guān)操作的枚舉值,我們可以參考UIKit.Framework的頭文件,可以看到大量的枚舉定義。

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {  
    UIViewAnimationTransitionNone,//默認(rèn)從0開始  
    UIViewAnimationTransitionFlipFromLeft,  
    UIViewAnimationTransitionFlipFromRight,  
    UIViewAnimationTransitionCurlUp,  
    UIViewAnimationTransitionCurlDown,  
};  

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {  
    UIViewAutoresizingNone                 = 0,  
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,  
    UIViewAutoresizingFlexibleWidth        = 1 << 1,  
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,  
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,  
    UIViewAutoresizingFlexibleHeight       = 1 << 4,  
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5  
};  

從枚舉定義來看,NS_ENUM和NS_OPTIONS本質(zhì)是一樣的,僅僅從字面上來區(qū)分其用途。NS_ENUM是通用情況,NS_OPTIONS一般用來定義具有位移操作或特點(diǎn)的情況(bitmask)。

位移枚舉詳解

枚舉的定義還支持位運(yùn)算的方式定義,就是NS_OPTIONS

特點(diǎn)1:等于號(hào)后面必須等于1
特點(diǎn)2:按照2進(jìn)制位移位數(shù),確定數(shù)值

typedef NS_ENUM(NSInteger, Test)  
{  
  TestA       = 1,      //1   1   1  
  TestB       = 1 << 1, //2   2   10 
  TestC       = 1 << 2, //4   3   100  
  TestD       = 1 << 3, //8   4   1000   
  TestE       = 1 << 4  //16  5   10000  

};

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

推薦閱讀更多精彩內(nèi)容

  • 剛從事IOS這行的時(shí)候,const很少用,主要是用#define和enum,后來慢慢的注意到,如何提升代碼的...
    張付東閱讀 2,393評(píng)論 0 3
  • static 修飾局部變量 讓局部變量只初始化一次 局部變量在程序中只有一份內(nèi)存 并不會(huì)改變局部變量的作用域,僅僅...
    大沖哥閱讀 1,382評(píng)論 0 1
  • 第1章 熟悉Objective-C 第1條 了解Objective-C語言的起源 Objective-C是一種“消...
    __silhouette閱讀 648評(píng)論 0 4
  • 我以為我會(huì)和別人不同 原來 寂寞的時(shí)候所有人都一樣
    阿城__閱讀 307評(píng)論 0 0
  • 那一只白鳥,孤行萬里遙。長(zhǎng)喉歌晚照,大羽覆塵勞。原是流云作,相迎歸暮謠。霖舟徐入夢(mèng),合翼落霞橋。
    大美不仁閱讀 1,782評(píng)論 7 1