1??.const和宏的區別
宏是預編譯,const是編譯時刻,只會編譯一次;宏不會檢查錯誤,const會檢查錯誤,常用的字符串通常使用const修飾;宏的優點是可以定義一段代碼,如果一個文件里面宏太多,會造成編譯時間過長.但是其實定義宏并不會消耗內存,只會分配一次內存地址.
2??.const的使用:只能修飾變量(基本數據類型,指針變量 (int *),對象變量),const修飾的變量,僅僅是修飾相鄰右邊的變量,表示只讀,不可以修改.
int const a = 10
,a的值不可修改,但是仍然是變量,是個只讀變量.
const int a = 10
,a也是只讀變量
用const修飾指針變量
int a = 10;
int *const p = &a //p:只讀變量, *p:變量
const int *p = &a //*p:只讀變量, p:變量
int const *p = &a //*p:只讀變量,p:變量
int const * const p = &a //*p:只讀,p:只讀
const int *const p = &a //*p:只讀,p:只讀
3??.const的使用場景
1.全局只讀變量NSString *const name = @"little prince"
2.方法中定義個只讀參數;-(void)test:(NSString * const)name
方法中就不可以修改name的值了.
4??.static
1:修飾局部變量,會延長局部變量的生命周期,只要程序運行,局部變量一直存在,而且只會分配一次內存.
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{ // static:修飾的變量,程序一運行就會分配一次內存
static int i = 0;
i++;
NSLog(@"%d",i);//i的值一直增加
}
2.修飾全局變量:只會修飾全局變量的作用域,表示只能是當前類內中可以使用.
???.extern
只能申明一個變量,不能定義變量,修飾的變量不能初始化.一般用于申明全局變量,全局變量和VC的加載沒有關系.比如在ViewController.m
中申明一個全局 int i = 3,在AppDelegate.m
中extern int i.并且打印i可以得到值3.
6??.static 和const修飾全局變量,
static修飾全局變量,修改作用域,在當前文件中使用,const表示變量只讀的.聯合修飾時靜態全局只讀變量.Static NSString * const name = @"rose";
7??.extern和const聯合使用,全局的只讀變量
extern NSString * const name = @"rose"
8??.我們可以創建一個文件,在.m中定義全局變量.需要在.m中導入Foundation框架.然后寫入全局變量,防止重復使用變量名.可以用UIKIT_EXTERN來代替extern,顯得高大上點.
以上??