關鍵字static
- 兩個概念:生命周期、作用域
生命周期
:這個變量能存活多久,它所占用的內存什么時候分配,什么時候收回。作用域
:這個變量在什么區域是可見的,可以拿來用的。
static
分兩種情況:修飾局部變量、修飾全局變量
1、static
修飾局部變量
局部變量:在函數/方法/代碼塊內聲明的變量。它的生命周期、作用域都是在這個代碼塊內。
局部變量 存儲在棧區(stack)
一旦出了這個代碼塊,存儲局部變量的這個棧內存就會被回收,局部變量也就被銷毀。
當用static
修飾局部變量時,變量被稱為靜態局部變量
,和全局變量,靜態全局變量一樣,是存儲在‘靜態存儲區’。
存儲在 靜態存儲區 的變量,其內存直到 程序結束 才會被銷毀。
即,生命周期是整個源程序。
靜態局部變量
的生命周期是整個源程序,但,作用域是聲明它的代碼塊內。
2、static
修飾全局變量
-
當全局變量沒有使用
static
修飾時
其存儲在靜態存儲區,直到程序結束才銷毀。也就是其作用域是整個源程序。
我們可以使用extern
關鍵字來引用這個全局變量。 -
當全局變量使用
static
修飾時
其生命周期沒有變,依舊是在程序結束時才銷毀。但是其作用域變了。現在只限於申明它的這個文件才可見。
使用extern
關鍵字無法引用這個全局變量。
全局變量本來是在整個源程序的所有文件都可見,static
修飾后,改為只在申明自己的文件可見,即修改了作用域。
static int num; //僅本文件可見 @implementation @end
關鍵字const
主要強調變量是不可修改的。
const修飾的是其右邊的值,也就是const右邊的這個整體的值不能改變。
static NSString const *name = @"abc"; static const NSString *name = @"bac"; //兩種寫法等價 // name是 指針變量, *name是 指針指向的變量的值
*
是指針指向符,主要看*
與const
的前后關系
NSString const *str = @"abc"; // 值不變
1、const
在*
前:const
修飾*str
這個整體,所以這個整體不能改變,這個整體是str
指向的內存中的值
。
NSString * const str = @"abc"; // 地址不變
2、const
在*
后:
表示str
指向的地址
不能改變
關鍵字extern
主要是用來引用全局變量
,它的原理是先在本文件中查找,查找不到再到其他文件中查找。
.h中
@interface PDConst : NSObject extern NSString *const appBaseURL; @end
.m中
@implementation PDConst NSString *const currentBaseURL = @"http://192...."; @end