iOS開發(fā)實(shí)用技巧之變量的定義:const吩案、static棚赔、extern

參考文章:
iOS 不要用宏來定義你的常量
iOS開發(fā)實(shí)用技巧—const、static徘郭、extern簡介
iOS開發(fā)筆記系列-基礎(chǔ)6(預(yù)處理程序)

總結(jié):

不使用宏定義變量靠益,定義變量的常用方法使用const、static崎岂、extern組合的方式

  • "執(zhí)行時(shí)刻":宏是預(yù)編譯(編譯之前處理)捆毫,const是編譯階段。
  • "編譯檢查":宏不做檢查冲甘,不會(huì)報(bào)編譯錯(cuò)誤绩卤,只是替換,const會(huì)編譯檢查江醇,會(huì)報(bào)編譯錯(cuò)誤濒憋。
  • "宏的好處":宏能定義一些函數(shù),方法陶夜。 const不能凛驮。
  • "宏的壞處":使用大量宏,容易造成編譯時(shí)間久条辟,每次都需要重新替換黔夭。
  • 宏不帶類型信息
  • 宏可以被修改

組合方式:

static與const

  • static與const作用:聲明一個(gè)只讀的靜態(tài)變量
  • 開發(fā)使用場(chǎng)景:在"一個(gè)文件中"經(jīng)常使用的字符串常量,可以使用static與const組合
// 開發(fā)中常用static修飾全局變量,只改變作用域

// 為什么要改變?nèi)肿兞孔饔糜蛴鸬眨乐怪貜?fù)聲明全局變量本姥。

// 開發(fā)中聲明的全局變量,有些不希望外界改動(dòng)杭棵,只允許讀取婚惫。

// 比如一個(gè)基本數(shù)據(jù)類型不希望別人改動(dòng)

// 聲明一個(gè)靜態(tài)的全局只讀常量
static const int a = 20;

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

// iOS中staic和const常用使用場(chǎng)景,是用來代替宏魂爪,把一個(gè)經(jīng)常使用的字符串常量先舷,定義成靜態(tài)全局只讀變量.

// 開發(fā)中經(jīng)常拿到key修改值,因此用const修飾key,表示key只讀滓侍,不允許修改蒋川。
static  NSString * const key = @"name";

// 如果 const修飾 *key1,表示*key1只讀,key1還是能改變撩笆。

static  NSString const *key1 = @"name";

extern與const

  • 開發(fā)中使用場(chǎng)景:在"多個(gè)文件中"經(jīng)常使用的同一個(gè)字符串常量捺球,可以使用extern與const組合街图。
  • 原因:
  • static與const組合:在每個(gè)文件都需要定義一份靜態(tài)全局變量。
  • extern與const組合:只需要定義一份全局變量懒构,多個(gè)文件共享。
  • 全局常量正規(guī)寫法:開發(fā)中便于管理所有的全局變量耘擂,通常搞一個(gè)GlobeConst文件胆剧,里面專門定義全局變量,統(tǒng)一管理醉冤,要不然項(xiàng)目文件多不好找秩霍。
GlobeConst.h
/*******************************首頁****************************/

extern NSString * const nameKey;

/*******************************首頁****************************/
GlobeConst.m
#import <Foundation/Foundation.h>

/*******************************首頁****************************/

NSString * const nameKey = @"name";


/*******************************首頁****************************/

補(bǔ)充:

const作用:限制類型

  • const僅僅用來修飾右邊的變量(基本數(shù)據(jù)變量p,指針變量*p)
  • 被const修飾的變量是只讀的蚁阳。
    const開發(fā)中使用場(chǎng)景:
  • 需求1:提供一個(gè)方法铃绒,這個(gè)方法的參數(shù)是地址,里面只能通過地址讀取值,不能通過地址修改值
  • 需求2:提供一個(gè)方法螺捐,這個(gè)方法的參數(shù)是地址颠悬,里面不能修改參數(shù)的地址。

staic 的作用

  • 修飾局部變量:
    1.延長局部變量的生命周期,程序結(jié)束才會(huì)銷毀定血。
    2.局部變量只會(huì)生成一份內(nèi)存,只會(huì)初始化一次赔癌。
    3.改變局部變量的作用域。
  • 修飾全局變量
    1.只能在本文件中訪問,修改全局變量的作用域,生命周期不會(huì)改
    2.避免重復(fù)定義全局變量

"extern作用":

  • 只是用來獲取全局變量(包括全局靜態(tài)變量)的值澜沟,不能用于定義變量
  • "extern工作原理":
  • 先在當(dāng)前文件查找有沒有全局變量灾票,沒有找到,才會(huì)去其他文件查找茫虽。

define

define語句的基本用途之一就是給富豪名稱指定程序常量刊苍。比如:

#define TRUE 1 //沒有分號(hào)結(jié)尾

此處定義了名稱TRUE,并使它等于值1濒析。之后正什,名稱TRUE可用于程序中任何需要常量1的地方,只要出現(xiàn)這個(gè)名稱悼枢,預(yù)處理程序自動(dòng)將這個(gè)名稱替換為預(yù)定義的值1埠忘。

預(yù)定義名稱不是變量,因此馒索,不能給它賦值莹妒,除非替換指定值的結(jié)果實(shí)際上是個(gè)變量。#define語句中預(yù)定義名稱右邊的所有字符都會(huì)被預(yù)處理程序自動(dòng)替換到程序中绰上,這類似于文本搜索和替換旨怠。

#define通常放在程序的開始,#import或#include之后蜈块,這并不是必須的鉴腻,它可以出現(xiàn)在程序的任何地方迷扇。預(yù)定義名稱沒有局部定義之類得說法,一旦定義一個(gè)名稱爽哎,就可以在程序的任何地方使用它蜓席。

預(yù)定義程序假設(shè)定義包含在程序的一行中,如果需要第二行课锌,那么上一行的最后一個(gè)字符必須是反斜線符號(hào)()厨内。

預(yù)定義不僅適用于單個(gè)的值,也可以是更高級(jí)的表達(dá)式渺贤,比如帶有參數(shù)的名稱即函數(shù)宏雏胃,在函數(shù)宏時(shí),函數(shù)名稱和參數(shù)列表的左括號(hào)之間不允許有空格

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末志鞍,一起剝皮案震驚了整個(gè)濱河市瞭亮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌固棚,老刑警劉巖统翩,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異此洲,居然都是意外死亡唆缴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門黍翎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來面徽,“玉大人,你說我怎么就攤上這事匣掸√宋桑” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵碰酝,是天一觀的道長霎匈。 經(jīng)常有香客問我,道長送爸,這世上最難降的妖魔是什么铛嘱? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮袭厂,結(jié)果婚禮上墨吓,老公的妹妹穿的比我還像新娘。我一直安慰自己纹磺,他們只是感情好帖烘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橄杨,像睡著了一般秘症。 火紅的嫁衣襯著肌膚如雪照卦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天乡摹,我揣著相機(jī)與錄音役耕,去河邊找鬼。 笑死聪廉,一個(gè)胖子當(dāng)著我的面吹牛蹄葱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锄列,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惯悠!你這毒婦竟也來了邻邮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤克婶,失蹤者是張志新(化名)和其女友劉穎筒严,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情萤,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸭蛙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筋岛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娶视。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睁宰,靈堂內(nèi)的尸體忽然破棺而出肪获,到底是詐尸還是另有隱情,我是刑警寧澤柒傻,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布孝赫,位于F島的核電站,受9級(jí)特大地震影響红符,放射性物質(zhì)發(fā)生泄漏青柄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一预侯、第九天 我趴在偏房一處隱蔽的房頂上張望致开。 院中可真熱鬧,春花似錦萎馅、人聲如沸喇喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拣技。三九已至千诬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膏斤,已是汗流浹背徐绑。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莫辨,地道東北人傲茄。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像沮榜,于是被迫代替她去往敵國和親盘榨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 一蟆融、const與宏的區(qū)別(面試題): const簡介:之前常用的字符串常量草巡,一般是抽成宏,但是蘋果不推薦我們抽成宏...
    Lv明閱讀 282評(píng)論 0 0
  • static 修飾局部變量 讓局部變量只初始化一次 局部變量在程序中只有一份內(nèi)存 并不會(huì)改變局部變量的作用域型酥,僅僅...
    大沖哥閱讀 1,345評(píng)論 0 1
  • 一山憨、const與宏的區(qū)別(面試題): const簡介:之前常用的字符串常量,一般是抽成宏弥喉,但是蘋果不推薦我們抽成宏...
    指尖猿閱讀 383評(píng)論 0 2
  • 一郁竟、const與宏的區(qū)別: const簡介:之前常用的字符串常量,一般是抽成宏由境,但是蘋果不推薦我們抽成宏棚亩,推薦我們...
    一頭奔跑的牛閱讀 281評(píng)論 0 1
  • 一、const與宏的區(qū)別: const簡介:之前常用的字符串常量虏杰,一般是抽成宏蔑舞,但是蘋果不推薦我們抽成宏,推薦我們...
    金約21依代閱讀 228評(píng)論 0 1