OC中的 全局變量且警、局部變量、靜態(tài)全局變量礁遣、靜態(tài)局部變量

將從存儲方式斑芜、生命周期(時間)作用域(空間) 三個維度來區(qū)分它們祟霍。

1 存儲方式

  • 靜態(tài)存儲方式
    靜態(tài)存儲方式是 程序一開始運(yùn)行時就分配存儲空間杏头,從程序開始運(yùn)行到程序結(jié)束,存儲空間都保持不變的存儲方式沸呐。
  • 動態(tài)存儲方式
    動態(tài)存儲是 程序在運(yùn)行時醇王,需要使用時才分配存儲空間,不需要使用時立即釋放的存儲方式崭添。不像靜態(tài)存儲寓娩,還未使用的時候就分配,程序結(jié)束才收回。

2 進(jìn)程的內(nèi)存分區(qū)

RAMZones.png
  • 代碼區(qū)
    存放代碼棘伴,只讀防止運(yùn)行時被修改寞埠。

  • 常量區(qū)

  • 全局(靜態(tài))區(qū)

    • 數(shù)據(jù)區(qū)
      靜態(tài)存儲方式下,變量被分配的空間焊夸,放在這里的變量已經(jīng)初始化仁连。
    • BSS
      同數(shù)據(jù)區(qū)相同,只不過放在這里的變量還沒有初始化阱穗。

  • 動態(tài)存儲方式下怖糊,變量被分配的空間,它大小并不固定,可動態(tài)擴(kuò)張或縮減颇象。當(dāng)進(jìn)程調(diào)用alloc等函數(shù)分配內(nèi)存時,新分配的內(nèi)存就被動態(tài)添加到堆上(堆被擴(kuò)張)并徘;當(dāng)利用realse釋放內(nèi)存時遣钳,被釋放的內(nèi)存從堆中被剔除(堆被縮減)。放在這里的變量需要程序員手動管理(ARC本質(zhì)上還是屬于手動管理)麦乞。


  • 動態(tài)存儲方式下蕴茴,變量被分配的空間,此時變量由操作系統(tǒng)和編譯器管理姐直。并不需要人為管理倦淀。

3 全局變量 局部變量

C語言中的定義:全局變量是申明在函數(shù)之外的變量,局部變量是申明在函數(shù)內(nèi)部声畏,以及函數(shù)的形式參數(shù)的變量

  • 全局變量

    • 存儲方式:靜態(tài)存儲撞叽,存儲在全局(靜態(tài))區(qū)
    • 生命周期:靜態(tài)存儲方式決定了其生命周期為 從程序開始運(yùn)行到程序結(jié)束
    • 作用域:該程序的所有文件。
  • 局部變量

    • 存儲方式:動態(tài)存儲插龄, 存儲在堆(對象類型)或棧(數(shù)據(jù)類型)中
    • 生命周期:動態(tài)存儲方式決定了其生命周期為 變量使用期間
    • 作用域:方法和函數(shù)內(nèi)愿棋,確切的說從申明到遇到 ‘}‘ 為止。
#import "ViewController.h"

int age = 24;//全局初始化區(qū)(數(shù)據(jù)區(qū))

NSString *name;//全局未初始化區(qū)(BSS區(qū))

@implementation ViewController

- (void)viewDidLoad {
 
    [super viewDidLoad];

    int tmpAge;//棧
 
    NSString *number = @"123456"; //123456\0在常量區(qū)均牢,*number在棧上糠雨。
    
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:1];//分配而來的8字節(jié)的區(qū)域就在堆中,*array在棧中徘跪,指向堆區(qū)的地址
    
    NSInteger total = [self getTotalNumber:1 number2:1];
}

- (NSInteger)getTotalNumber:(NSInteger)number1 number2:(NSInteger)number2{

    return number1 + number2;//number1和number2 棧區(qū)
}

@end

4 全局變量 靜態(tài)全局變量

全局變量在第3部分已經(jīng)說明甘邀,靜態(tài)全局變量就是在全局變量的前面加上 static 關(guān)鍵字。
由 static 修飾的 靜態(tài)全局變量和全局變量的存儲方式垮庐、生命周期是相同的松邪。但是它們的作用域是不同的,全局變量在所有文件中都可以訪問到突硝,而靜態(tài)全局變量只能在其申明的文件中才能訪問到测摔。也就是說,static改變了全局變量的作用域,從而達(dá)到對其他文件隱藏變量的目的锋八,這是static的第一個作用浙于。

  • 靜態(tài)全局變量
    • 存儲方式:靜態(tài)存儲,存儲在全局(靜態(tài))區(qū)
    • 生命周期:靜態(tài)存儲方式決定了其生命周期為 從程序開始運(yùn)行到程序結(jié)束
    • 作用域:只有申明該變量的文件才可以訪問到挟纱。
#import "ViewController.h"

NSSting *name = @"jake"  //全局變量羞酗,在其他文件中通過 extern 關(guān)鍵字 可以訪問到。

static NSSting *nikeNmae = @"jeek" //靜態(tài)全局變量紊服,只可以在本文件中訪問到檀轨。

@implementation ViewController

- (void)viewDidLoad {
 
    [super viewDidLoad];
}

@end

5 局部變量 靜態(tài)局部變量

局部變量在第3部分已經(jīng)說明,靜態(tài)局部變量就是在局部變量的前面加上 static 關(guān)鍵字欺嗤。
由 static 修飾的 靜態(tài)局部變量和局部變量的作用域是相同的参萄。但是它們的存儲方式是不同的,存儲方式的不同導(dǎo)致了它們的生命周期也是不同的煎饼。 也就是說static改變了局部變量的存儲方式讹挎,從而達(dá)到保存變量的目的,這是static的第二個作用吆玖。

  • 靜態(tài)局部變量
    • 存儲方式:靜態(tài)存儲筒溃,存儲在全局(靜態(tài))區(qū)
    • 生命周期:靜態(tài)存儲方式決定了其生命周期為 從程序開始運(yùn)行到程序結(jié)束
    • 作用域:方法和函數(shù)內(nèi),確切的說從申明到遇到 ‘}‘ 為止沾乘。
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
   
    [super viewDidLoad];

    for (int i = 0; i < 5; i++) {
        
        [self textC];
    }
}

- (void)textC{
    
    NSUInteger localInt = 0;  //局部變量 
    
    static NSUInteger staticLocalInt = 0;  //靜態(tài)局部變量
    
    NSLog(@"局部變量 = %lu,靜態(tài)局部變量 = %lu",(unsigned long)localInt,(unsigned long)staticLocalInt);
    
    localInt++;
    
    staticLocalInt++;
}

// 運(yùn)行結(jié)果
2017-06-25 21:31:30.583 ARC-Learn[11825:712288] 局部變量 = 0,靜態(tài)局部變量 = 0
2017-06-25 21:31:30.584 ARC-Learn[11825:712288] 局部變量 = 0,靜態(tài)局部變量 = 1
2017-06-25 21:31:30.584 ARC-Learn[11825:712288] 局部變量 = 0,靜態(tài)局部變量 = 2
2017-06-25 21:31:30.584 ARC-Learn[11825:712288] 局部變量 = 0,靜態(tài)局部變量 = 3
2017-06-25 21:31:30.584 ARC-Learn[11825:712288] 局部變量 = 0,靜態(tài)局部變量 = 4

//局部變量是動態(tài)存儲方式怜奖,調(diào)用textc()時,localInt分配內(nèi)存翅阵,調(diào)用結(jié)束時立即收回內(nèi)存歪玲,下次調(diào)用在重新分配內(nèi)存。所以數(shù)據(jù)是無法保存的怎顾。  
//靜態(tài)局部變量是靜態(tài)存儲方式读慎,程序開始運(yùn)行時,staticLocalInt分配內(nèi)存槐雾,只分配這一次內(nèi)存夭委,也就是說只初始化一次,textc調(diào)用結(jié)束時并不收回募强,而是等到程序結(jié)束時才收回株灸。

6 總結(jié)

想要比較透徹的理解 全局變量、靜態(tài)全局變量擎值、局部變量慌烧、靜態(tài)局部變量是什么,以及它們的區(qū)別鸠儿,一定要了解

  • 兩中存儲方式:靜態(tài)存儲屹蚊、動態(tài)存儲厕氨;
  • 存儲方式的定義不難看出變量的存儲方式?jīng)Q定其生命周期
  • 進(jìn)程中的內(nèi)存分區(qū):代碼區(qū)常量區(qū)汹粤、全局(靜態(tài))區(qū)命斧、嘱兼;
  • 采用靜態(tài)存儲方式的變量存儲在全局(靜態(tài))區(qū)国葬,采用動態(tài)存儲方式的變量存儲在堆(對象類型)棧(數(shù)據(jù)類型芹壕、指針)
  • 局部變量和全局變量是根據(jù)它們申明的位置來區(qū)分的
  • 靜態(tài)全局變量和靜態(tài)局部變量分別是在全局變量和局部變量的基礎(chǔ)上加上 static 關(guān)鍵字汇四。
  • 全局變量、靜態(tài)全局變量踢涌、靜態(tài)局部變量采用靜態(tài)存儲方式通孽,局部變量采用動態(tài)存儲方式
  • 對于全局變量來說睁壁,static 改變了其作用域利虫;對于局部變量來說,static改變了其存儲方式堡僻,從而改變了生命周期。因此 static 這個說明符在不同的地方所起的作用是不同的疫剃。應(yīng)予以注意钉疫。

7 參考

本文參考了以下博客,向原作者表示感謝巢价!同時本人水平有限牲阁,如有錯誤還請指出,不甚感激壤躲!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末城菊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碉克,更是在濱河造成了極大的恐慌凌唬,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漏麦,死亡現(xiàn)場離奇詭異客税,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撕贞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門更耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捏膨,你說我怎么就攤上這事秧均∈澄辏” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵目胡,是天一觀的道長锯七。 經(jīng)常有香客問我,道長讶隐,這世上最難降的妖魔是什么起胰? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮巫延,結(jié)果婚禮上效五,老公的妹妹穿的比我還像新娘。我一直安慰自己炉峰,他們只是感情好畏妖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疼阔,像睡著了一般戒劫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婆廊,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天迅细,我揣著相機(jī)與錄音,去河邊找鬼淘邻。 笑死茵典,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宾舅。 我是一名探鬼主播统阿,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筹我!你這毒婦竟也來了扶平?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蔬蕊,失蹤者是張志新(化名)和其女友劉穎结澄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岸夯,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡概而,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了囱修。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赎瑰。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖破镰,靈堂內(nèi)的尸體忽然破棺而出餐曼,到底是詐尸還是另有隱情压储,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布源譬,位于F島的核電站集惋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏踩娘。R本人自食惡果不足惜刮刑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望养渴。 院中可真熱鬧雷绢,春花似錦、人聲如沸理卑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藐唠。三九已至帆疟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宇立,已是汗流浹背踪宠。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妈嘹,地道東北人殴蓬。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蟋滴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痘绎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容