參考文章:
iOS 不要用宏來定義你的常量
iOS開發(fā)實(shí)用技巧—const、static徘郭、extern簡介
iOS開發(fā)筆記系列-基礎(chǔ)6(預(yù)處理程序)
總結(jié):
不使用宏定義變量靠益,定義變量的常用方法使用const、static崎岂、extern組合的方式
- "執(zhí)行時(shí)刻":宏是預(yù)編譯(編譯之前處理)捆毫,const是編譯階段。
- "編譯檢查":宏不做檢查冲甘,不會(huì)報(bào)編譯錯(cuò)誤绩卤,只是替換,const會(huì)編譯檢查江醇,會(huì)報(bào)編譯錯(cuò)誤濒憋。
- "宏的好處":宏能定義一些函數(shù),方法陶夜。 const不能凛驮。
- "宏的壞處":使用大量宏,容易造成編譯時(shí)間久条辟,每次都需要重新替換黔夭。
- 宏不帶類型信息
- 宏可以被修改
組合方式:
static與const
- static與const作用:聲明一個(gè)只讀的靜態(tài)變量
- 開發(fā)使用場(chǎng)景:在"一個(gè)文件中"經(jīng)常使用的字符串常量,可以使用static與const組合
// 開發(fā)中常用static修飾全局變量,只改變作用域
// 為什么要改變?nèi)肿兞孔饔糜蛴鸬眨乐怪貜?fù)聲明全局變量本姥。
// 開發(fā)中聲明的全局變量,有些不希望外界改動(dòng)杭棵,只允許讀取婚惫。
// 比如一個(gè)基本數(shù)據(jù)類型不希望別人改動(dòng)
// 聲明一個(gè)靜態(tài)的全局只讀常量
static const int a = 20;
// staic和const聯(lián)合的作用:聲明一個(gè)靜態(tài)的全局只讀常量
// iOS中staic和const常用使用場(chǎng)景,是用來代替宏魂爪,把一個(gè)經(jīng)常使用的字符串常量先舷,定義成靜態(tài)全局只讀變量.
// 開發(fā)中經(jīng)常拿到key修改值,因此用const修飾key,表示key只讀滓侍,不允許修改蒋川。
static NSString * const key = @"name";
// 如果 const修飾 *key1,表示*key1只讀,key1還是能改變撩笆。
static NSString const *key1 = @"name";
extern與const
- 開發(fā)中使用場(chǎng)景:在"多個(gè)文件中"經(jīng)常使用的同一個(gè)字符串常量捺球,可以使用extern與const組合街图。
- 原因:
- static與const組合:在每個(gè)文件都需要定義一份靜態(tài)全局變量。
- extern與const組合:只需要定義一份全局變量懒构,多個(gè)文件共享。
- 全局常量正規(guī)寫法:開發(fā)中便于管理所有的全局變量耘擂,通常搞一個(gè)GlobeConst文件胆剧,里面專門定義全局變量,統(tǒng)一管理醉冤,要不然項(xiàng)目文件多不好找秩霍。
GlobeConst.h
/*******************************首頁****************************/
extern NSString * const nameKey;
/*******************************首頁****************************/
GlobeConst.m
#import <Foundation/Foundation.h>
/*******************************首頁****************************/
NSString * const nameKey = @"name";
/*******************************首頁****************************/
補(bǔ)充:
const作用:限制類型
- const僅僅用來修飾右邊的變量(基本數(shù)據(jù)變量p,指針變量*p)
- 被const修飾的變量是只讀的蚁阳。
const開發(fā)中使用場(chǎng)景:- 需求1:提供一個(gè)方法铃绒,這個(gè)方法的參數(shù)是地址,里面只能通過地址讀取值,不能通過地址修改值
- 需求2:提供一個(gè)方法螺捐,這個(gè)方法的參數(shù)是地址颠悬,里面不能修改參數(shù)的地址。
staic 的作用
- 修飾局部變量:
1.延長局部變量的生命周期,程序結(jié)束才會(huì)銷毀定血。
2.局部變量只會(huì)生成一份內(nèi)存,只會(huì)初始化一次赔癌。
3.改變局部變量的作用域。- 修飾全局變量
1.只能在本文件中訪問,修改全局變量的作用域,生命周期不會(huì)改
2.避免重復(fù)定義全局變量
"extern作用":
- 只是用來獲取全局變量(包括全局靜態(tài)變量)的值澜沟,不能用于定義變量
- "extern工作原理":
- 先在當(dāng)前文件查找有沒有全局變量灾票,沒有找到,才會(huì)去其他文件查找茫虽。
define
define語句的基本用途之一就是給富豪名稱指定程序常量刊苍。比如:
#define TRUE 1 //沒有分號(hào)結(jié)尾
此處定義了名稱TRUE,并使它等于值1濒析。之后正什,名稱TRUE可用于程序中任何需要常量1的地方,只要出現(xiàn)這個(gè)名稱悼枢,預(yù)處理程序自動(dòng)將這個(gè)名稱替換為預(yù)定義的值1埠忘。
預(yù)定義名稱不是變量,因此馒索,不能給它賦值莹妒,除非替換指定值的結(jié)果實(shí)際上是個(gè)變量。#define語句中預(yù)定義名稱右邊的所有字符都會(huì)被預(yù)處理程序自動(dòng)替換到程序中绰上,這類似于文本搜索和替換旨怠。
#define通常放在程序的開始,#import或#include之后蜈块,這并不是必須的鉴腻,它可以出現(xiàn)在程序的任何地方迷扇。預(yù)定義名稱沒有局部定義之類得說法,一旦定義一個(gè)名稱爽哎,就可以在程序的任何地方使用它蜓席。
預(yù)定義程序假設(shè)定義包含在程序的一行中,如果需要第二行课锌,那么上一行的最后一個(gè)字符必須是反斜線符號(hào)()厨内。
預(yù)定義不僅適用于單個(gè)的值,也可以是更高級(jí)的表達(dá)式渺贤,比如帶有參數(shù)的名稱即函數(shù)宏雏胃,在函數(shù)宏時(shí),函數(shù)名稱和參數(shù)列表的左括號(hào)之間不允許有空格