iOS 宏(define)與常量(const)的正確使用

在iOS開發中,常常用到宏定義,或用const修飾一些數據類型,常常有開發者不知怎麼正確使用,致使項目中亂用宏與const修飾api

你能區分下面的嗎?知道何時用嗎?測試

#define HSCoder @"漢斯哈哈哈"
NSString *HSCoder = @"漢斯哈哈哈";
extern NSString *HSCoder;
extern const NSString *HSCoder;

static const NSString *HSCoder = @"漢斯哈哈哈";

const NSString *HSCoder = @"漢斯哈哈哈";
NSString const *HSCoder = @"漢斯哈哈哈";
NSString * const HSCoder = @"漢斯哈哈哈";

當咱們想全局共用一些數據時,能夠用宏、變量、常量

宏:優化

#define HSCoder @"漢斯哈哈哈"

變量:spa

NSString *HSCoder = @"漢斯哈哈哈";

常量:code

四種寫法:
static const NSString *HSCoder = @"漢斯哈哈哈";
const NSString *HSCoder = @"漢斯哈哈哈";
NSString const *HSCoder = @"漢斯哈哈哈";
NSString * const HSCoder = @"漢斯哈哈哈";

思考:宏與常/變量的選擇?圖片

  • 宏:只是在預處理器裏進行文本替換,沒有類型,不作任何類型檢查,編譯器能夠對相同的字符串進行優化。只保存一份到 .rodata 段。甚至有相同後綴的字符串也能夠優化,你能夠用GCC 編譯測試,"Hello world" 與 "world" 兩個字符串,只存儲前面一個。取的時候只須要給前面和中間的地址,若是是整形、浮點型會有多份拷貝,但這些數寫在指令中。佔的只是代碼段而已,大量用宏會致使二進制文件變大
  • 變量:共享一塊內存空間,就算項目中N處用到,也不會分配N塊內存空間,能夠被修改,在編譯階段會執行類型檢查
  • 常量:共享一塊內存空間,就算項目中N處用到,也不會分配N塊內存空間,能夠根據const修飾的位置設定可否修改,在編譯階段會執行類型檢查

儘可能使用const,看蘋果api使用常量多點,以下圖:內存

這裏寫圖片描述開發

常量區分

全局常量:無論你定義在任何文件夾,外部都能訪問字符串

const NSString *HSCoder = @"漢斯哈哈哈";

例如:編譯器

在ViewController定義一個 HSCoder 字符串全局常量:

這裏寫圖片描述

在AppDelegate中訪問:

這裏寫圖片描述

局部常量:用static修飾後,不能提供外界訪問

static const NSString *HSCoder = @"漢斯哈哈哈";

例如:

在ViewController定義一個 HSCoder 字符串局部常量:

這裏寫圖片描述

編譯時報錯:

這裏寫圖片描述

const修飾位置不一樣,表明什麼?

1.const NSString *HSCoder = @"漢斯哈哈哈";
2.NSString const *HSCoder = @"漢斯哈哈哈";
3.NSString * const HSCoder = @"漢斯哈哈哈";
1.const NSString *HSCoder = @"漢斯哈哈哈";
"*HSCoder"不能被修改, "HSCoder"能被修改

2.NSString const *HSCoder = @"漢斯哈哈哈";
"*HSCoder"不能被修改, "HSCoder"能被修改

3.NSString * const HSCoder = @"漢斯哈哈哈";
"HSCoder"不能被修改,"*HSCoder"能被修改

注意:1和2其實沒什麼區別

結論:const右邊的總不能被修改

驗證:

const int *p;

這裏寫圖片描述

int const *p;

這裏寫圖片描述

int * const p;

這裏寫圖片描述

因此通常咱們定義一個常量又不想被修改應該這樣:

NSString * const HSCoder = @"漢斯哈哈哈";

測試:

在ViewController定義一個常量HSCoder:

這裏寫圖片描述

在AppDelegate修改常量HSCoder,看下面報錯提示:

這裏寫圖片描述

通常項目中,定義全局常量,會寫在獨立文件裏

HSConst.m 定義常量:

這裏寫圖片描述

HSConst.h 提供外接訪問常量:

這裏寫圖片描述

在AppDelegate中訪問:


 

文/漢斯哈哈哈(簡書做者) 原文連接:http://www.jianshu.com/p/f83335e036b5 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。

相關文章
相關標籤/搜索