起首,預處置敕令他不是一個常量!!!!
我們來看一段代碼
#define avatar @"60" if (false) { #define avatar @"80" } NSLog(avatar);
這段代碼會輸入若干,我們將“avatar”界說為了60,然後在一個永久不會履行的代碼外面從新界說了“avatar”為80,if語句中的代碼永久不會履行,然則在編譯時代,編譯器會編譯這段代碼,而這個時刻編譯器就會將avatar這個名字調換為@“80”,所以這段代碼最初的輸入成果就是80。
固然這個時刻編譯器是會有一個正告的,然則不曉得有若干同窗會疏忽這個正告。或許你會告知我你對正告非常敏感,不會放過他的,然則記住你不是一小我在寫代碼,能夠在他人的頁面他給你從新界說了你的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。
【談談為什麼iOS開辟別用宏來界說常量】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!