一。C語言中的static的做用 ios
在C語言中,static的字面意思很容易把咱們導入歧途,其實它的做用有三條。 程序員
(1)第一個做用:隱藏。 函數
當咱們同時編譯多個文件時,全部未加static前綴的全局變量和函數都具備全局可見性。爲理解這句話,我舉例來講明。咱們要同時編譯兩個源文件,一個是a.c,另外一個是main.c。 spa
下面是a.c的內容 .net
#include<cstdio>增長這條語句 pwa
char a = ‘A‘; // global variable 對象
void msg() blog
{ 生命週期
printf("Hello\n"); 內存
}
你可能會問:爲何在a.c中定義的全局變量a和函數msg能在main.c中使用?前面說過,全部未加static前綴的全局變量和函數都具備全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,而且都沒有加static前綴,所以對於另外的源文件main.c是可見的。
若是加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性能夠在不一樣的文件中定義同名函數和同名變量,而沒必要擔憂命名衝突。Static能夠用做函數和變量的前綴,對於函數來說,static的做用僅限於隱藏,而對於變量,static還有下面兩個做用。
(2)static的第二個做用是保持變量內容的持久。存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是惟一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來,static能夠控制變量的可見範圍,說到底static仍是用來隱藏的。
(3)static的第三個做用是默認初始化爲0。其實全局變量也具有這一屬性,由於全局變量也存儲在靜態數據區。在靜態數據區,內存中全部的字節默認值都是0x00,某些時候這一特色能夠減小程序員的工做量。
最後對static的三條做用作一句話總結。首先static的最主要功能是隱藏,其次由於static變量存放在靜態存儲區,因此它具有持久性和默認值0。
下面是main.c的內容
除了頭文件,須要聲明函數:void msg();
int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}
二。靜態變量,局部變量,static,變量的有效範圍和生命週期,可見性
2.1
static 隱藏做用 賦初值一次,之後值能夠改變,改變一次保存一次之後改變了得值,一個變量能夠由stati進行再說明,而且改變其原有的存儲方式
2.2
自動變量是局部變量,如不做專門說明爲靜態變量,都是動態分配存儲空間,存儲在動態存儲區中。這種變量叫自動變量。這種變量只在定義它們的時候才建立,在定義它們的函數返回時系統回收變量所佔存儲空間。對這些變量存儲空間的分配和回收是由系統自動完成的,因此也叫自動變量。通常狀況下,不做專門說明的局部變量,均是自動變量 自動變量包括函數形參和非static局部變量,他也不是說動態變量的意思。自動變量說明這個變量是再棧上在運行時自動建立自動撤銷。
2.3
靜態局部變量和自動變量的區別:它們的共同點是有效範圍都侷限在函數內,不一樣的是生存週期不同,自動變量從進函數開始到退出函數,而靜態變量從程序啓動一直到結束。另外,本質的不一樣是,自動變量在棧中,靜態變量在程序的數據段中。
2.4局部變量又叫自動變量,是在函數內部聲明或定義的,函數退出後就自動消失了。全局變量是在函數外部定義的,要到程序結束後才能消失。靜態變量也只有局部和全局兩種狀況,但不管哪種狀況,它的值是永久存在的,直到程序結束時才消失。不過它的可見性與相應的自動變量同樣,即局部靜態變量的可見性是函數,而全局靜態變量的可見性是程序。OC的全局靜態變量的可見性只在該類,除非用類方法返回該對象,其餘類才能調用。
2.5靜態變量固然是屬於靜態存儲方式,可是屬於靜態存儲方式的量不必定就是靜態變量, 例如(全局)外部變量雖屬於靜態存儲方式,但不必定是靜態變量
三。 extern和static的區別// static 只初始化一次,存儲在靜態區
// extern 傳值 相似於全局變量
// 1:OC中有靜態成員變量,可是沒有類成員變量,也就是說不能使用 Class.Variables 的形式訪問.
// 2:static變量的做用域被限制在定義變量的當前文件中,其它文件是不能訪問的;能夠經過靜態方法返回的方式訪問。
// Static 的做用和其它語言中的不同,全部實例共享同一個變量,不對的呢,沒有這種功能,也不能這樣用。
//extern能夠置於變量或者函數前,以表示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其餘模塊中尋找其定義。(另外,extern也可用來進行連接指定,這個沒遇到過,ios暫時不清楚)。
//好比:viewA中定義 NSString *var = @"hello";,寫在.m的@implementation上面
//viewB中這樣定義 extern NSString *var;此時,從A進入B後,B中的var = @"hello"。.m或.h均可以
下面這段程序能夠看出static修飾的局部變量和普通局部變量的區別:NSLog(@"\n\n\n\n\n\n");
for (int i = 0 ; i < 3; i++) {
int num1 = 100;
static int num2 = 100;
NSLog(@"\nnum1 = %d", num1);
NSLog(@"\nnum2 = %d", num2);
num1++;
num2++;
NSLog(@"\nnum1加以後%d", num1);
NSLog(@"\nnum2加以後%d", num2);
NSLog(@"\n\n\n\n");
}
四。
const的做用是使一個變量的值保持不變,關於const,extern和static這三個修飾符的做用查看下面網址
http://blog.csdn.net/xpwang168/article/details/8087143 objectiveC【語法】修飾符 static extern const