一角塑、全局變量 / 宏 / 常量 比較
- 全局變量:
int age = 20; 缺點(diǎn):能修改,優(yōu)點(diǎn):內(nèi)存中只保存一份,不會(huì)產(chǎn)生很多臨時(shí)空間
+ 宏:
```objc
#define age 20 優(yōu)點(diǎn):不可修改,缺點(diǎn):會(huì)產(chǎn)生很多臨時(shí)的內(nèi)存空間
- 常量:
const int age = 20;優(yōu)點(diǎn):不能修改只讀痛阻,且內(nèi)存中只會(huì)有一份存儲(chǔ)空間
// 等價(jià)于 int const age = 20;
-
注意:
Snip20150906_60.png
Snip20150906_61.png
Snip20150906_62.png
二、 總結(jié):
const:const只修飾它右邊的內(nèi)容腮敌,被const修飾的內(nèi)容都是常量阱当。
-
static:
- 被static修飾的全局變量/常量,僅限當(dāng)前文件訪問
- 被static修飾的局部變量糜工,只會(huì)占用一塊內(nèi)存弊添,整個(gè)程序運(yùn)行不會(huì)銷毀,只會(huì)初始化一次捌木。
extern:可以引用一個(gè)全局變量/常量
-
常量使用潛規(guī)則
常量必須在編譯時(shí)就必須有確定的值
三油坝、作用域
- int money; 全局變量:
- 默認(rèn)情況下,全世界都是可以訪問的刨裆,不僅限某一個(gè)類澈圈,利用extern可以引用一個(gè)全局變量,如:extern int money; =>引用某個(gè)類的全局變量money帆啃。而且我們可以對(duì)全局變量money進(jìn)行修改瞬女。
-
const int money ;
默認(rèn)情況下,全世界都可以用努潘,但是不可用改诽偷,只讀:extern const int money; =》 只讀不可改。
注意:類中函數(shù)也是:全世界都可以訪問的疯坤,我們只需要引用即可調(diào)用报慕。引用函數(shù)寫法:extern void eat();
-
static int money;
- 被static修飾的全局變量:作用域:只限制在當(dāng)前文件中訪問使用。
-
static int const money;
- 被static修飾的全局常量:僅限當(dāng)前文件中使用贴膘,且不可改卖子,只讀
四、 應(yīng)用:
1. 字符串常量
// cellID 字符串被const 修飾了刑峡,洋闽,字符串類型的cellID不可改
NSString * const cellID = @"cellTagID"; // 注意:NSString字符串 == 一個(gè)指針指向它
int const *age = 10; // age 不可修改
總結(jié)寫法:const 和 變量 緊挨著避免不必要的錯(cuò)誤
-
常量使用潛規(guī)則
常量必須在編譯時(shí)就必須有確定的值
// 是錯(cuò)誤的,因?yàn)閇UIColor redColor] -> 是在運(yùn)行時(shí)才確定的突梦,不符合常量使用的潛規(guī)則
UIColor *const JPGlobalColor = [UIColor redColor];
// 宏定義正確
#define JPGlobalColor [UIColor redColor]
2. cell標(biāo)識(shí)
// JPHomeCellID诫舅,僅限當(dāng)前文件,不可改宫患,只占一份內(nèi)存空間刊懈。
static NSString *const JPHomeCellID = @"JPHomeCellID";
3. URL字符串,保證全世界內(nèi)存只有一份且全世界都可以訪問娃闲,且不可更改
3.1 思路分析
- 全世界都可以訪問:所有不能用static(僅限某一個(gè)類訪問)
- 全世界內(nèi)存都只有一塊:不能用#define宏(多次拷貝虚汛,會(huì)存在多塊內(nèi)存)定義;
- 不可更改:定義為
常量
3.2 解決方案
- 方案一(不可行):定義常量放入pch文件 : 缺點(diǎn)-> 所有的類引用皇帮,重復(fù)定義
// 不可行卷哩,因?yàn)閜ch文件內(nèi)容會(huì)拷貝到每一個(gè)文件中,這樣會(huì)引起重復(fù)定義問題
NSString *const JPRequestURL = @"http://baidu.com";
- 方案二(不可仁羰啊):麻煩
- 1.常量的定義放在一個(gè)const.m文件中
NSString *const JPRequestURL = @"http://baidu.com";
- 2.然后在pch文件中引用const.m文件中定義的常量
```objc
extern NSString *const JPRequestURL; // extern 引用常量将谊,這樣就解決的只在pch中定義常量引起的重復(fù)定義的問題,而且保證了一份內(nèi)存
- 3.缺點(diǎn):如果有100個(gè)渐白,就需要在const.m文件中定義100個(gè)常量尊浓,然后在pch文件中利用extern引用100個(gè)定義的常量
- 方案三(最終方案):
- 簡(jiǎn)單,解決了方案二中引用麻煩的問題
- 步驟:
- 在const.m(定義所有常量)中定義常量的值纯衍,
NSString *const JPRequestURL = @"http://baidu.com";
+ 在const.h文件(引用定義的全局常量)中引用定義的全局常量
```objc
#import <UIKit/UIKit.h>
// URL
UIKIT_EXTERN NSString *const JPRequestURL;
+ 在pch文件中導(dǎo)入const.h文件即可
#import "const.h"
4. 定義Rect結(jié)構(gòu)體變量commonRect栋齿,要求只有本文件中能訪問,且不可修改
使用全局處理襟诸,取代宏定義
思路分析:只有本文件中能訪問 -> static修改commonRect變量褒颈;不可修改 -> 且還用const修改;
-
注意:Rect結(jié)構(gòu)體創(chuàng)建有兩張方式 : CGRectMake(0,0,50,50) ->運(yùn)行時(shí)才能確定其值励堡;{{0,0},{50,50}} ->編譯時(shí)就確定其值了谷丸。如何選擇呢?
- 很明顯应结,我們需要定義常量刨疼,還記得常量的潛規(guī)則是什么嗎?-> 常量的值必須編譯時(shí)就確定鹅龄,否則會(huì)報(bào)錯(cuò)的揩慕,所以我們只能通過{{0,0},{50,50}}方式創(chuàng)建結(jié)構(gòu)體常量。
實(shí)現(xiàn)
// 正確
static CGRect const commonRect = {{0,0},{50,50}};
// 錯(cuò)誤
static CGRect const commonRect = CGRectMake(0,0,50,50);
五扮休、全局常量寫法
1. 僅限本文件中訪問
- 在.m中寫下面代碼
static 類型 const 常量名 = 常量值;
2. 全世界都要訪問
- 1>在const.m文件中迎卤,(const.m定義所有全局常量)
#import <UIKit/UIKit.h>
類型 const 常量名 = 常量值;
.........
- 2>在const.m文件中,寫下列代碼(引用所有全局常量)
#import <UIKit/UIKit.h>
UIKIT_EXTERN 類型 const 常量名;
.........
- 3>在pch文件中包含const.m文件玷坠,導(dǎo)入頭文件
#import "const.h"