static
-
修飾局部變量
- 讓局部變量只初始化一次
- 局部變量在程序中只有一份內(nèi)存
- 并不會(huì)改變局部變量的作用域,僅僅是改變了局部變量的生命周期(只到程序結(jié)束,這個(gè)局部變量才會(huì)銷(xiāo)毀)
-
修飾全局變量
- 全局變量的作用域僅限于當(dāng)前文件
const
- 沒(méi)有const修飾的指針
- 指針p和*p都能被修改
// 定義一個(gè)指針變量
int *p = NULL;
// 定義2個(gè)int類(lèi)型的變量
int a = 10;
int b = 30;
// p指向a
p = &a;
*p = 20;
// p指向b
p = &b;
*p = 40;
NSLog(@"%d %d", a, b);
- const修飾的*p
- 被const修飾的*p只能被賦值一次,以后不能賦值,否則編譯器報(bào)錯(cuò)
// const修飾的*p
const int *p = NULL;
int const *p = null;
*p = 20; // 編譯器報(bào)錯(cuò),不能修改*p的值
- const修飾的p
- 被const修飾的p只能存一次地址,以后再也不能其它存地址了,否則編譯器報(bào)錯(cuò)
// const修飾的指針變量p
int * const p = NULL;
int a = 20;
p = &a; // 編譯器報(bào)錯(cuò),不能修改指針變量p
- const在聲明字符串的用法
NSString * const ZMJName = @"jack";
static和const聯(lián)合使用
- static將一個(gè)全局變量變成局部變量
- const將一個(gè)局部變量變成局部常量
// 定義了一個(gè)局部常量
static const CGFloat ZMJRed = 0.4;
static const CGFloat ZMJGreen = 0.6;
static const CGFloat ZMJBlue = 0.7;
使用static const 與 #define
- 使用static const修飾變量和宏定義的比較
- 相同點(diǎn)
- 都不能再被修改
- 一處修改,其它都改了
- 不同點(diǎn)
- static const修飾變量只有一份內(nèi)存
- 宏定義,只是簡(jiǎn)單的替換,每次使用都需要?jiǎng)?chuàng)建一份內(nèi)存
- 相同點(diǎn)
- 結(jié)論
- 使用static const修飾更加高效,在同一個(gè)文件內(nèi)可以使用
static const
取代#define
- 使用static const修飾更加高效,在同一個(gè)文件內(nèi)可以使用
// static const修飾變量只有一份內(nèi)存
static const CGFloat ZMJRed = 0.4;
// 宏定義,只是用0.4替換ZMJRed,每次使用都需要?jiǎng)?chuàng)建一份內(nèi)存
#define ZMJRed 0.4
const實(shí)際開(kāi)發(fā)的應(yīng)用
- 一般會(huì)先新建
ZMJConst.h
文件專(zhuān)門(mén)存放常量的引用
// 引用某變量,如果沒(méi)有使用const修飾,就不能直接在編譯的時(shí)候就能檢測(cè)是否修改了ZMJRed
extern const CGFloat ZMJRed;
extern NSString * const ZMJName;
- 可以模仿系統(tǒng)UIKIT_EXTERN來(lái)代替extern,逼格更高!
UIKIT_EXTERN const CGFloat ZMJRed;
UIKIT_EXTERN NSString * const ZMJName;
- 一般會(huì)新建
ZMJConst.m
文件專(zhuān)門(mén)存放static const修飾的變量,需要用的時(shí)候?qū)腩^文件就可以了。
// 定義了整個(gè)程序都能訪問(wèn)的常量
const CGFloat ZMJRed = 0.4;
NSString * const ZMJName = @"jack";