時常在單例模式中看到static關鍵字,不明就裏照搬總歸無法理解其中的奧義,今天又寫到單例決心已定要明白static的道理於是查看文檔,如下:
static關鍵字
前面的局部變量通常都在每次程序進入該局部變量的作用域時分配並在離開時釋放。這類存儲稱爲自動存儲(默認關鍵字auto)。
static關鍵字會在聲明變量的時候分配內存,在程序運行期間只分配一次內存。之後再訪問時,實際都是在訪問原先分配的內存。這適合用於存儲創建時使用大量的資源,並且不常改變的局部變量。
void
func() {
static
Expensive * p = [[Expensive alloc] init];
[p doSomeOp];
}
int
main(
int
argc,
const
char
* argv[])
{
func();
// 第一次調用時創建 p
func();
// 第二次調用,此時p已存在,不會再次創建
return
0;
}
因爲全局變量默認位於全局作用域中,所以其行爲和靜態變量一樣。也就是說,它們只分配一次內存,並在整個程序運行期間保持不變。
const關鍵字
const同樣會修改所聲明變量的內存行爲,它所修飾的變量是隻讀的,即第一次初始化後它的值將不能改變。通常用來聲明常量。
#import <Foundation/Foundation.h>
int
main(
int
argc,
const
char
* argv[])
{
const
NSString *str = @
"BeiJing"
;
str = @
"ShangHai"
;
// 會產生一個編譯錯誤
NSLog(@
"dd, %@"
, str);
return
0;
}