亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

談談為何iOS開發別用宏來定義常量

2020-07-26 03:17:25
字體:
來源:轉載
供稿:網友

首先,預處理命令他不是一個常量?。。?!

我們來看一段代碼

#define avatar @"60" if (false) {  #define avatar @"80" } NSLog(avatar);

這段代碼會輸出多少,我們將“avatar”定義為了60,然后在一個永遠不會執行的代碼里面重新定義了“avatar”為80,if語句中的代碼永遠不會執行,但是在編譯時期,編譯器會編譯這段代碼,而這個時候編譯器就會將avatar這個名字替換為@“80”,所以這段代碼最后的輸出結果就是80。

當然這個時候編譯器是會有一個警告的,但是不知道有多少同學會忽略這個警告?;蛘吣銜嬖V我你對警告十分敏感,不會放過他的,但是記住你不是一個人在寫代碼,可能在別人的頁面他給你重新定義了你的define,給你挖了一個大坑,還找不著.........

用const來定義一個常量

const修飾符定義的變量是不可變的,比如說你需要定義一個動畫時間的常量,你可以這么做:

static const NSTimeInterval kAnimateDuration = 0.3;

當你試圖去修改“ kAnimateDuration”的值的時候,編譯器會報錯。更加重要的是用這種方法定義的常量是帶有類型信息的,而這點則是define不具備的。

也許你已經發現了,如果你像這樣定義:

static const NSString * kUserName = @"StrongX";

你是可以修改userName的值的,(說好的常量呢~~~)

首先我們需要確定的是以下兩種寫法是一樣的:

static NSString const * kUserName = @"StrongX";static const NSString * kUserName = @"StrongX";


也就是說const放在類型前還是類型后是一樣的效果。然后不同效果的是下面這種寫法:

static NSString * const kUserName = @"StrongX";

const 修飾的是他右邊的部分,也就是說:

static NSString const * kUserName = static NSString const (* kUserName )static NSString * const kUserName = static NSString * const (kUserName)

const修飾的是(userName)的時候,不可變的是userName;“*”在C語言中表示
指針指向符,也就是說這個時候userName指向的內存塊地址不可變,而內存保存的內容是可變的,我們來做個嘗試:

 NSLog(@"內存地址: %x",& kUserName); kUserName = @"superXLX"; NSLog(@"內存地址: %x",& kUserName);

以上NSLog會打印*userName指向的內存塊地址,而他的輸出是:


輸出

我們已經發現當我們改變內存的內存的時候他的地址并沒有發生改變,也就是說這是符合“const”修飾符的規定的。

而當我們的修飾符是這樣的時候:

static NSString * const kUserName = @"StrongX";

我們則無法改變userName的值。

所以當我們需要定義一個不可變的常量的時候 ,我們還是需要將“const”修飾符放到“*”指針指向符后邊才對。

一定要同時使用static和const來定義你的變量

上面已經說了const是用來定義一個常量。而static在C語言中(OC中延用)則表明此變量只在改變量的輸出文件中可用(.m文件),如果你不加“static”符號,那么編譯器就會對該變量創建一個“外部符號”,后果是什么呢?
你可以嘗試在不同編譯文件中加入以下代碼:

NSString * const kUserName = @"StrongX";

可能盡管文件之間并沒有相互引用,不存在屬性名重復的問題(因為這并不是一個屬性,這是一個外部符號),但是編譯器還是報錯了:

他會告訴你在兩個目標文件(.0文件是.m文件編譯后的輸出文件)有一個重復的符號。(OC中沒有類似C++中的名字空間的概念)

所以當你在你自己的.m文件中需要聲明一個只有你自己可見的局部變量(k開頭)的變量的時候一定要同時使用“static”“const”兩個符號。

定義工程中的全局變量

在我們的工程中一定會定義很多全局常量,很多人的做法是會創建一個“ constant.h”文件,在這個文件中用#define聲明許多常量,然后將這個頭文件引入“pch”文件中,不能說這么做不對,但是如同上面說的那樣define可能被修改,當然在命名規范的情況下這種情況很少出現,并且這樣做的效率很高。

然而蘋果更推薦另外一種做法:"extern",這樣做的優勢是保持常量絕對不會被修改,并且一定初始化還帶有類型信息。

我們在"constants.h"文件中,聲明常量

extern NSString *const XUserName;

然后在“constants.m”中定義他:

NSString *const XUserName = @"StrongX";

“extern”定義的常量必須也只能初始化一次,不滿足必須以及只能一次的條件那么編譯器就會提醒你。在定義全局變量的時候需要要注意你的命名,你可以使用規定好的前綴來命名。

“define”“extern”各有各的優勢,不過我個人還是比較推薦使用“extern”.(因為之前在一個工程中被define坑慘了!)。

以上就是本文的全部內容,希望本文提到的知識點對大家開發IOS時有所幫助,讓大家都能使用正確的規范開發IOS。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产第一页| 97欧美精品一区二区三区| 57pao成人永久免费视频| 久久精品男人天堂| 亚洲少妇中文在线| 欧美国产亚洲视频| 在线观看日韩av| 国产精品国语对白| 日韩专区在线播放| 人九九综合九九宗合| 亚洲欧美精品伊人久久| 欧美精品videosex牲欧美| 久久人人爽亚洲精品天堂| 国产精品久久久久久久9999| 亚洲午夜女主播在线直播| 国产精品亚洲美女av网站| 亚洲毛片在线观看| 在线成人中文字幕| 国产精品自在线| 亚洲欧美国产精品专区久久| 亚洲精品美女视频| 国产精品白嫩初高中害羞小美女| 亚洲午夜激情免费视频| 日韩精品在线观看一区二区| 亚洲精品免费网站| 亚洲欧美在线看| 日本午夜在线亚洲.国产| 日韩专区中文字幕| 亚洲一区二区三区久久| 国产精品视频久久| 欧美日韩一二三四五区| 亚洲国产欧美久久| 热久久免费视频精品| 国产v综合ⅴ日韩v欧美大片| 日韩一区视频在线| 亚洲欧美成人精品| 日韩av电影手机在线观看| 久久久精品在线观看| 久久精品美女视频网站| 日本精品久久久| 久久久噜久噜久久综合| 久久精品在线视频| 久久精品99无色码中文字幕| 久久成人这里只有精品| 国产精品中文字幕在线| 亚洲精品在线视频| 91精品视频一区| 国产手机视频精品| 欧美日韩亚洲激情| 亚洲成人激情在线观看| 亚洲国产欧美在线成人app| 高跟丝袜欧美一区| 97超级碰碰人国产在线观看| 欧美激情视频在线| 日韩在线精品视频| 国产精品高潮粉嫩av| 久久精品电影一区二区| 国产一区二区三区在线免费观看| 国产欧美一区二区三区在线| 97视频在线观看亚洲| 亚洲护士老师的毛茸茸最新章节| 国产亚洲精品va在线观看| 欧美电影免费观看高清完整| 911国产网站尤物在线观看| 欧美大片va欧美在线播放| 国产精品小说在线| 亚洲毛茸茸少妇高潮呻吟| 自拍视频国产精品| 精品国产电影一区| 日韩在线观看免费| 91精品国产色综合| 亚洲最大中文字幕| 成人福利在线视频| 国产中文字幕亚洲| 欧美激情手机在线视频| 国模叶桐国产精品一区| 亚洲国产欧美一区二区三区久久| 久久久久一本一区二区青青蜜月| 亚洲国产另类 国产精品国产免费| 日韩美女写真福利在线观看| 久久精品99久久久久久久久| 久久精品国产精品亚洲| 成人激情在线观看| 亚洲精品视频网上网址在线观看| 亚洲r级在线观看| 欧美精品久久久久| 国产精品999| 在线精品国产成人综合| 欧美激情国产精品| 日本成人精品在线| 欧美激情高清视频| 2019亚洲日韩新视频| 美乳少妇欧美精品| 国产精品爱久久久久久久| 午夜剧场成人观在线视频免费观看| 欧美网站在线观看| 国产精品美女视频网站| 久久免费高清视频| 久久精品人人做人人爽| 中文字幕亚洲欧美日韩2019| 日韩av网站在线| 亚洲欧美精品中文字幕在线| 97碰碰碰免费色视频| 亚洲激情 国产| 亚洲欧美日韩一区二区在线| 日韩视频在线一区| 97精品国产aⅴ7777| 精品国产欧美一区二区三区成人| 久热精品视频在线观看| 亚洲精品在线不卡| 国产欧亚日韩视频| 疯狂做受xxxx欧美肥白少妇| 尤物yw午夜国产精品视频| 欧美午夜www高清视频| 欧美高清电影在线看| 国产一区二区三区免费视频| 欧美午夜性色大片在线观看| 97国产真实伦对白精彩视频8| 国产一区二区三区在线视频| 亚洲丝袜在线视频| 法国裸体一区二区| 国产精品欧美在线| 人人做人人澡人人爽欧美| 亚洲免费精彩视频| 国内伊人久久久久久网站视频| 国产一区av在线| 欧美午夜电影在线| 欧美精品videofree1080p| 自拍偷拍亚洲区| 亚洲国产精久久久久久久| 欧美主播福利视频| 成人网在线观看| 插插插亚洲综合网| 欧美精品videosex极品1| 成人有码在线视频| 国产欧美在线看| 色婷婷综合久久久久中文字幕1| 97精品视频在线观看| 欧美激情精品久久久久久蜜臀| 欧美激情视频给我| 国产精品精品国产| 青青草99啪国产免费| 久久久久免费精品国产| 欧美亚州一区二区三区| 欧美日本中文字幕| 久久噜噜噜精品国产亚洲综合| 热久久99这里有精品| 538国产精品视频一区二区| 亚洲aaa激情| 97精品一区二区三区| 91系列在线观看| 成人国产亚洲精品a区天堂华泰| 欧美精品一区三区| 国产一区二区三区视频免费| 亚洲欧美日本另类| 91精品久久久久久久久| 亚洲精品视频在线播放| 不卡av日日日| 国产亚洲精品美女久久久久| 亚洲欧美制服中文字幕| 日韩av免费在线播放| 69av在线视频| 国产99久久精品一区二区永久免费| 亚洲欧洲xxxx|