淺談static修飾符的作用

先說結(jié)論,下面再寫用代碼解釋。

  • 修飾局部變量

    • 讓局部變量只初始化一次
    • 局部變量在程序中只有一份內(nèi)存
    • 并不會(huì)改變局部變量的作用域,僅僅是改變了局部變量的生命周期(只到程序結(jié)束,這個(gè)局部變量才會(huì)銷毀)
  • 修飾全局變量

    • 全局變量的作用于僅限于當(dāng)前文件

修飾局部變量

寫一個(gè)test方法,在main中調(diào)用3次

void test() {
    int age = 0;
//    static int age = 0;    age++;
    NSLog(@"%d", age);
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        test();
        test();
        test();
    }
    return 0;
}

打印結(jié)果:

不用static修飾時(shí):
2016-08-11 11:18:21.392 Static講解[5800:133430] 1
2016-08-11 11:18:21.393 Static講解[5800:133430] 1
2016-08-11 11:18:21.393 Static講解[5800:133430] 1

使用static修飾時(shí):
2016-08-11 11:19:35.966 Static講解[5811:134281] 1
2016-08-11 11:19:35.967 Static講解[5811:134281] 2
2016-08-11 11:19:35.967 Static講解[5811:134281] 3

由此可見,不使用static修飾時(shí),每次調(diào)用都會(huì)申請(qǐng)內(nèi)存創(chuàng)建一個(gè)局部變量。使用static修飾后,只申請(qǐng)了一次內(nèi)存,創(chuàng)建了一個(gè)局部變量,每次訪問的都是這一個(gè)局部變量。age的作用域只在test方法內(nèi)。

修飾全局變量

新建一個(gè)Car類,定義一個(gè)全部變量age

@interface Car : NSObject

@end

@implementation Car

int age = 10;

@end

在main.m中引用age變量

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        extern int age;
        NSLog(@"%d", age);
        age++;
        NSLog(@"%d", age);
    }
    return 0;
}

打印如下:

2016-08-11 11:37:23.266 Static講解[5905:143679] 10
2016-08-11 11:37:23.267 Static講解[5905:143679] 11

我們看到第一次打印出了10,這說明Car中定義的全部變量在項(xiàng)目的任意地方都是可以被引用的,作用域是全部文件;第二次打印了11,說明Car中age可以被外部修改。

在Car類的age前面使用static修飾后再次運(yùn)行

static int age = 10;

這次運(yùn)行不了,出現(xiàn)錯(cuò)誤了

Undefined symbols for architecture x86_64:
  "_age", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64

提示在main.m中找不到age的外部引用,也就是說static修飾后,age的作用域不再是全部文件,而是Car.m文件。

建議定義全局變量時(shí),使用static修飾,避免引起沒必要的錯(cuò)誤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,740評(píng)論 18 399
  • 重點(diǎn)掌握 3 類對(duì)象和方法 對(duì)象就是一個(gè)物體 類的獨(dú)特存在就是一個(gè)實(shí)例,對(duì)實(shí)例進(jìn)行操作叫做方法。方法可以應(yīng)用于類或...
    Coder大雄閱讀 1,370評(píng)論 0 2
  • Blocks Blocks Blocks 是帶有局部變量的匿名函數(shù) 截取自動(dòng)變量值 int main(){ ...
    南京小伙閱讀 1,078評(píng)論 1 3
  • 1、VVDocumenter 還在為代碼注釋不夠規(guī)范煩惱嗎?試試vvdocumenter,只需在需要注釋的地...
    牧碼人_閱讀 289評(píng)論 0 1
  • 早期我的青春偶像里,霉霉占據(jù)著主導(dǎo)地位。當(dāng)年她頂著一顆泡面頭甩的飛起,手里抱著一把民謠吉他,在舞臺(tái)上盡情跳躍,一首...
    北岸有北及閱讀 1,183評(píng)論 0 1

友情鏈接更多精彩內(nèi)容