在項目中,我們經(jīng)常全局用到一些常量弦叶,那么這些常量在項目中怎么管理呢俊犯?看完這篇文章相信,讀者應(yīng)該不在迷惑了伤哺。
文章展開之前燕侠,先向讀者擴(kuò)充幾個基本知識點
宏:只是在預(yù)處理器里進(jìn)行文本替換,沒有類型立莉,
不做任何類型檢查
绢彤,編譯器可以對相同的字符串進(jìn)行優(yōu)化。只保存一份到 .rodata 段蜓耻。甚至有相同后綴的字符串也可以優(yōu)化茫舶,你可以用GCC 編譯測試,"Hello world" 與 "world" 兩個字符串刹淌,只存儲前面一個饶氏。取的時候只需要給前面和中間的地址,如果是整形有勾、浮點型會有多份拷貝疹启,但這些數(shù)寫在指令中。占的只是代碼段而已蔼卡,大量用宏會導(dǎo)致二進(jìn)制文件變大,定義的宏一般放在pch文件中
#define LYUserDefault [NSUserDefaults standardUserDefaults]
#define LYAccount @"account"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[LYUserDefault setValue:@"value" forKey:LYAccount];
}
常量:共享一塊內(nèi)存空間喊崖,就算項目中N處用到,也不會分配N塊內(nèi)存空間雇逞,設(shè)置全局常量可以用const修飾荤懂,用extern取這個全局常量,根據(jù)const修飾的位置設(shè)定能否修改喝峦,在編譯階段會執(zhí)行類型檢查,一般常量是寫在某個專門的頭文件中的
const和extern
- 1成翩、
const 修飾的常量是全局并且是只讀的横缔,意思是說,你在某個文件中用const 修飾了一個常量,那么在整個項目工程中都可以訪問的到脚草,并且不能修改,用extern進(jìn)行取值
- 比如: 我在某個Vc文件中聲明了這個全局常量
const NSString *testStr = @"liyang";
- 我用的時候是這樣的:
extern NSString *testStr;
NSLog(@"%@", strTest); // 結(jié)果是liyang
- 2裂逐、關(guān)于const修飾的位置
記住const只修飾它右邊的部分就可以了追逮,即它修飾的部分不可變
- 我們用一個c語言的指針說明這個問題
// 定義一個空指針(const 修飾它右邊的內(nèi)容,右邊是 *p谈喳, 所以*p不能更改)
const int *p = NULL;
// 定義2個int類型的變量
int a = 10;
int b = 30;
p = &a; // 指針p指向a的地址
*p = 20; //p 將a改成20 // 報錯
p = &b;
*p = 40; // 報錯
int * const p = NULL; // const修飾它右邊的值册烈,所有p不能改
// 定義2個int類型的變量
int a = 10;
int b = 30;
p = &a; // 指針p指向a的地址 // 報錯
*p = 20; //p 將a改成20
p = &b; // 報錯
*p = 40;
const和宏
常用的字符串常量,一般是抽成宏婿禽,但是蘋果不推薦我們抽成宏赏僧,推薦我們使用const常量
-
編譯時刻
:宏是預(yù)編譯(編譯之前處理)大猛,const是編譯階段。 -
編譯檢查
:宏不做檢查淀零,不會報編譯錯誤挽绩,只是替換,const會編譯檢查驾中,會報編譯錯誤唉堪。 -
宏的好處
:宏能定義一些函數(shù),方法肩民。 const不能唠亚。 -
宏的壞處
:使用大量宏,容易造成編譯時間久持痰,每次都需要重新替換灶搜。宏定義的是常量,常量都放在常量區(qū)共啃,只會生成一份內(nèi)存占调,并不會有生成N份內(nèi)存
static和extern
static:
- 修飾局部變量:
- 1.延長局部變量的生命周期,程序結(jié)束才會銷毀。
- 2.局部變量只會生成一份內(nèi)存,只會初始化一次
- 修飾全局變量
- 只能在本文件中訪問移剪,修改全局變量的作用域究珊,生命周期不會改變
extern:
- 只能用來獲取全局變量,不能用于定義變量
static和const
static和const的作用:聲明一個只讀的靜態(tài)變量
我們項目中應(yīng)該是這樣的
- 1纵苛、首先定義一個全局的頭文件.h剿涮,一般取名是Const,一般這個頭文件中放置的是對全局常量的引用,這個頭文件中的代碼
// 用UIKIT_EXTERN代替extern(可以參考蘋果UIWindow.h中寫法)
UIKIT_EXTERN const CGFloat LYRed;
UIKIT_EXTERN const CGFloat LYGreen;
UIKIT_EXTERN const CGFloat LYBlue;
UIKIT_EXTERN const CGFloat LYAlpha;
-2攻人、在定義一個空文件取试,取個頭文件.h一樣的文件名,但是后綴修改成.m怀吻,這個m文件中放的就是全局常量的定義
- 如果出現(xiàn)報錯瞬浓,記得引入相應(yīng)的框架比如:UIKit框架
下次再寫項目的時候,可以用到了