Static關(guān)鍵字理解(iOS)

Static修飾局部變量:

  • 當(dāng)static關(guān)鍵字修飾局部變量時衬横,只會初始化一次蜂林。
    例 1:
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    [self test];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    NSLog(@"---------- viewWillAppear -------------");
    [self test];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSLog(@"---------- viewDidAppear -------------");
    [self test];
}

- (void)test {
    NSInteger i = 0;
    i++;

    static NSInteger staticValue = 0;
    staticValue++;

    NSLog(@"i = %ld, s.value = %ld", (long)i, (long)staticValue);
}

@end

打印結(jié)果:


3150184-66674dabcf31ff21.jpg

  • 當(dāng)static關(guān)鍵字修飾局部變量時睁蕾,在程序中只有一份內(nèi)存瀑凝。
    例 2:
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    [self test];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    NSLog(@"---------- viewWillAppear -------------");
    [self test];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSLog(@"---------- viewDidAppear -------------");
    [self test];
}

- (void)test {
    NSString *normalString;
    static NSString *staticString;

    NSLog(@"normal = %p, static = %p", &normalString, &staticString);
}

@end

打印結(jié)果:

3150184-80134d255c4b1d33.jpg

從打印結(jié)果可以看出射窒,Static修飾的局部變量在程序中只有一份內(nèi)存(如圖結(jié)果:0x104358ef8)点寥。


  • Static關(guān)鍵字不可以改變局部變量的作用域蔽莱。
    例 3:
3150184-3d63c7af25a6fdef.jpg
如圖中所示,我在test方法中定義了一個static修飾的局部變量staticValue,如果想在其他方法中直接使用這個變量則會報錯:變量未聲明锅劝,所以可以得出結(jié)論:Static關(guān)鍵字修飾的局部變量只限制在當(dāng)前作用域范圍內(nèi)使用(即不可改變其作用域)。

  • Static關(guān)鍵字可延長局部變量的生命周期。
    這個觀點我們還是借助 例1 的代碼來說明痹籍。在例1中我們定義了一個普通局部變量i和一個static修飾的局部變量staticValue,分別讓他們自增1悠垛,然后輸出結(jié)果纱皆,在打印結(jié)果中我們看到普通局部變量的值永遠(yuǎn)是1(每當(dāng)調(diào)用一次函數(shù)派草,就會定義一個新的變量每次i的值都是零艺普,自增后就是1),而static修飾的局部變量的值會一直增長(被static修飾的變量只會初始化一次,永遠(yuǎn)都只有一份內(nèi)存),我們可以得出 Static關(guān)鍵字可延長局部變量的生命周期蛆橡,直到程序結(jié)束才銷毀

Static修飾全局變量:

  • 當(dāng)static關(guān)鍵字修飾全局變量時藐握,作用域僅限于當(dāng)前文件,外部類是不可以訪問到該全局變量的。

默認(rèn)情況下陌知,全局變量在整個程序中是可以被訪問的(即全局變量的作用域是整個項目文件)

#import "SLStaticDemo.h"

NSInteger age;

@implementation SLStaticDemo

@end

#import "ViewController.h"

NSInteger age;

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    age = 20;

    NSLog(@"age = %ld", (long)age);
}

在工程SLStaticDemo.m文件中聲明一個全局變量NSInteger age;,同時在ViewController.m文件中聲明一個全局變量NSInteger age;,然后編譯會報錯:

3150184-401622269a7c23f0.jpg

通過錯誤信息我們可以知道全局變量age重復(fù)聲明,所以可以驗證 全局變量的作用域是整個項目文件


要解決這個錯誤信息南窗,我們可以在全局變量前面添加static關(guān)鍵字万伤,把全局變量的作用域縮小到當(dāng)前文件呜袁,保證外部類無法訪問(即使在外部使用extern關(guān)鍵字也無法訪問)敌买。

#import "SLStaticDemo.h"

static NSInteger age;

@implementation SLStaticDemo

@end

Extern關(guān)鍵字

在上面我們提到extern關(guān)鍵字虹钮,那這個關(guān)鍵字的作用是什么呢芙粱?我們還是用上面的代碼來理解extern關(guān)鍵字的作用(注意:代碼中全局變量的定義 NSInteger age = 10; 并沒有static)春畔。

#import "SLStaticDemo.h"

NSInteger age = 10;

@implementation SLStaticDemo

@end

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    extern NSInteger age;
    NSLog(@"age = %ld", (long)age);

    age += 10;
    NSLog(@"age = %ld", (long)age);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

打印結(jié)果:

3150184-500e4dd7608bb6ad.jpg

從輸出結(jié)果 age = 10 我們可以看到即便我們在ViewController.m中并沒有import SLStaticDemo.h也能得到SLStaticDemo中定義的age變量律姨,這就是extern關(guān)鍵字的功勞(extern可以訪問全局變量)臼疫;

如果不想讓外部類訪問全局變量,則可以在定義全局變量時加上static關(guān)鍵字凤价。

總結(jié):

  1. static關(guān)鍵字修飾局部變量:
  • 當(dāng)static關(guān)鍵字修飾局部變量時,只會初始化一次且在程序中只有一份內(nèi)存湾盗;
  • 關(guān)鍵字static不可以改變局部變量的作用域格粪,但可延長局部變量的生命周期(直到程序結(jié)束才銷毀)帐萎。
  1. static關(guān)鍵字修飾全局變量:
  • 當(dāng)static關(guān)鍵字修飾全局變量時,作用域僅限于當(dāng)前文件赁项,外部類是不可以訪問到該全局變量的(即使在外部使用extern關(guān)鍵字也無法訪問)悠菜。
  1. extern關(guān)鍵字:
  • 想要訪問全局變量可以使用extern關(guān)鍵字(全局變量定義不能有static修飾)败富。

全局變量是不安全的兽叮,因為它可能會被外部修改鹦聪,所以在定義全局變量時推薦使用static關(guān)鍵字修飾。

參考鏈接:https://blog.csdn.net/gezi0630/article/details/51993934

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市琴儿,隨后出現(xiàn)的幾起案子造成,更是在濱河造成了極大的恐慌雄嚣,老刑警劉巖喘蟆,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骇吭,居然都是意外死亡燥狰,警方通過查閱死者的電腦和手機(jī)龙致,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屈梁,“玉大人榛了,你說我怎么就攤上這事≌胬剩” “怎么了遮婶?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慈省。 經(jīng)常有香客問我,道長袱衷,這世上最難降的妖魔是什么致燥? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任辐益,我火速辦了婚禮智政,結(jié)果婚禮上箱蝠,老公的妹妹穿的比我還像新娘续捂。我一直安慰自己,他們只是感情好抡锈,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布疾忍。 她就那樣靜靜地躺著乔外,像睡著了一般床三。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杨幼,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天撇簿,我揣著相機(jī)與錄音,去河邊找鬼差购。 笑死四瘫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的欲逃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诚纸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了井辆?” 一聲冷哼從身側(cè)響起奈虾,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琅摩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檀头,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡牙肝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年颂郎,在試婚紗的時候發(fā)現(xiàn)自己被綠了坎背。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡急膀,死狀恐怖聘殖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帮非,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布心剥,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦黍匾、人聲如沸填物。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盲镶。三九已至,卻和暖如春尼酿,著一層夾襖步出監(jiān)牢的瞬間思币,已是汗流浹背惶我。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工听怕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宏所。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丛版。 傳聞我的和親對象是個殘疾皇子州胳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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