iOS--宏定義

預(yù)處理

C語言的預(yù)處理(預(yù)編譯)主要有三個方面的內(nèi)容: 1.宏定義; 2.文件包含究孕; 3.條件編譯比搭」邗危“#”是編譯器預(yù)處理的標(biāo)志。

預(yù)處理(預(yù)編譯)工作也叫做宏展開:將宏名替換為文本(這個文本可以是字符串敢辩、可以是代碼等)蔽莱。
掌握"宏"概念的關(guān)鍵是“換”。

1.宏定義:預(yù)處理階段會將程序中所有用到宏定義的地方替換成原內(nèi)容戚长。因此盗冷,使用宏定義可以減少代碼量,保持一致性同廉,使開發(fā)過程更輕松仪糖。

2.文件包含:指的是頭文件的引入,在預(yù)編譯階段會把引入頭文件的內(nèi)容拷貝至當(dāng)前文件中。

#import "ClassA.h"

#import <Foundation/Foundation.h>

3.條件編譯:預(yù)編譯時可以根據(jù)條件來決定編譯哪塊代碼迫肖,可以減少編譯的代碼量

條件編譯指令 釋義
#undef 取消已定義的宏
#if 判斷表達(dá)式真假
#ifdef 如果宏已經(jīng)定義
#ifndef 如果宏沒有定義
#elif 上邊表達(dá)式不成立時锅劝,判斷當(dāng)前表達(dá)式是否成立
#endif 結(jié)束一個#if……#else條件編譯塊

宏定義

上邊簡單的提了一下宏定義,這里重點記錄下宏定義一些語法和用法蟆湖。

  1. 無參宏(直接帶過)

#define NUMBER 100
#define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter]

  1. 帶參宏
  • 固定參數(shù)
    如果讓你實現(xiàn)一個取最小值的宏函數(shù)故爵,你一定覺的很簡單,然后胸有成竹的就寫出了這行代碼

#define MIN(A,B) A < B ? A : B

看著邏輯上也沒有什么毛病隅津,嚯嚯嚯诬垂,小伙子,入坑了吧伦仍!我們知道預(yù)處理會在預(yù)編譯階段將預(yù)定義標(biāo)識替換成原內(nèi)容结窘,如果有宏嵌套,宏展開后充蓝,原先的邏輯可能會因為運算符的優(yōu)先級導(dǎo)致輸出錯誤隧枫。具體詳解請看大神之作《宏定義的黑魔法 - 宏菜鳥起飛手冊》喉磁。

正確寫法:(這真的不是一般的麻煩啊。官脓。协怒。)

#define MIN(A,B) ({ __typeof__(A)__a = (A); __typeof__(B) __b = (B); __a < __b ? __a :__b; })

  • 可變參數(shù)及特殊語法
特殊標(biāo)識 釋義 示例
# 單個”#“號的作用是字符串化 #define A(x) #x 調(diào)用 A(123) 將得到c字符串 "123"
@ @是objc的編譯符號,不屬于宏操作的對象 #define A(x) @#x 將得到OC字符串 @"123"
\ 連接換行符 放在行尾 然后換行 用來連接代碼塊
## 雙井號是連接符 #define A(x,y) x##y 調(diào)用 A(123,456) ==> 123456
__ 雙下滑線表示預(yù)定義确买,即已經(jīng)定義過的 __TIME__, __FUNCTION__, __LINE__ 等
... 任意個數(shù)的參數(shù),但是宏定義中只有... ,那么起碼有1個參數(shù) #define NSLog(...) {(NSLog)((format),__VAR_VACHS__);}
__VA_ARHS__ 配合...使用,表示的是宏定義中的...中的所有剩余參數(shù)斤讥,至少一個 同上
##__VA_ARHS__ 參數(shù)個數(shù)不限制纱皆,可為0 #define NSLog(format, ...) {(NSLog)((format),##__VAR_VACHS__);}

宏定義示例

單例
#define RF_SINGLETION(__clazz) \
+ (__clazz *)sharedInstance;

#define RF_DEF_SINGLETION(__clazz) \
static __clazz * __singletion;\
+ (__clazz *)sharedInstance \
{\
static dispatch_once_t once; \
dispatch_once(&once,^{__singletion = [[__clazz alloc] init];});\
return __singletion;\
}\
+ (id)allocWithZone:(struct _NSZone *)zone {\
    \
    if (!__singletion) {\
        \
        return [super allocWithZone: zone];\
        \
    }\
    \
    return nil;\
    \
}\
\
- (id)copy {\
    \
    return __singletion;\
    \
}\
初始化方法
#define INIT_CELL(_CLASS_NAME) \
\
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier \
{ \
NSLog(@"-------------- %@ init ----------", self.class); \
    [_CLASS_NAME description]; \
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) { \
        [self _CLASS_NAME##_internalInit]; \
    } \
    \
    return self; \
} \
\
- (void)awakeFromNib \
{ \
    [super awakeFromNib]; \
    \
    [self _CLASS_NAME##_internalInit]; \
} \
\
- (void)_CLASS_NAME##_internalInit

結(jié)語

本篇為知識總結(jié)湾趾,幫助自己查閱資料,后續(xù)會不斷更新派草。搀缠。。祝大家學(xué)習(xí)愉快近迁!^_^

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艺普,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鉴竭,更是在濱河造成了極大的恐慌歧譬,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搏存,死亡現(xiàn)場離奇詭異瑰步,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)璧眠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門缩焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人责静,你說我怎么就攤上這事袁滥。” “怎么了灾螃?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵题翻,是天一觀的道長。 經(jīng)常有香客問我腰鬼,道長嵌赠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任垃喊,我火速辦了婚禮猾普,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘本谜。我一直安慰自己初家,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溜在,像睡著了一般陌知。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掖肋,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天仆葡,我揣著相機(jī)與錄音,去河邊找鬼志笼。 笑死沿盅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纫溃。 我是一名探鬼主播腰涧,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼紊浩!你這毒婦竟也來了窖铡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤坊谁,失蹤者是張志新(化名)和其女友劉穎费彼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體口芍,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡箍铲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阶界。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虹钮。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖膘融,靈堂內(nèi)的尸體忽然破棺而出芙粱,到底是詐尸還是另有隱情,我是刑警寧澤氧映,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布春畔,位于F島的核電站,受9級特大地震影響岛都,放射性物質(zhì)發(fā)生泄漏律姨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一臼疫、第九天 我趴在偏房一處隱蔽的房頂上張望择份。 院中可真熱鬧烫堤,春花似錦荣赶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剩燥。三九已至慢逾,卻和暖如春灭红,著一層夾襖步出監(jiān)牢的瞬間侣滩,已是汗流浹背比伏。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工胜卤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留疆导,地道東北人赁项。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像澈段,于是被迫代替她去往敵國和親悠菜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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

  • 初學(xué)ios不久時間败富,對ios的宏定義充滿好奇悔醋,宏的各種高級用法讓ios代碼變得優(yōu)雅,那么宏究竟是什么兽叮,讓我來花時間...
    林帥并不帥閱讀 1,970評論 4 1
  • C中的預(yù)編譯宏定義 2009-02-10 作者: infobillows 來源:網(wǎng)絡(luò) 在將一個C源程序轉(zhuǎn)換為可執(zhí)行...
    白水灬煮一切閱讀 1,583評論 0 5
  • 1. 宏定義簡介 宏定義是使用#define將某段代碼芬骄、字符串等一串的文字,用一個宏來代替的一種預(yù)處理方式鹦聪。 2....
    Job_Yang閱讀 3,037評論 0 3
  • http://www.open-open.com/lib/view/open1390651437117.html ...
    Xtuphe閱讀 1,255評論 0 10
  • 宏簡介: 宏是一種批量處理的稱謂账阻。一般說來,宏是一種規(guī)則或模式泽本,或稱語法替換 淘太,用于說明某一特定輸入(通常是字符串...
    喬克蜀黍閱讀 3,612評論 0 11