Day 03 - 关於 const, static, extern 的三两事

#前言

由於前一篇使用了constextern,但对这两者还不太了解,於是又去看了其他人的文章,试图弄懂一点,就有了这篇~


#const

主要作用:

  1. 修饰 const 右边的基本变数或指标变数
  2. 被修饰的变数只能读,不能被修改 ⇒ 也就是常量,就像是Swift 的 let

下面举个简单例子:

//定义一个类型为int的变数a,初始值为10,const用来修饰a,因此a只可读,不可修改
int const a = 10;

a = 20; // error

const int a = 10; //跟前者等价

再来透过 *p 和 p 来理解 const 的用法:

int const *p  // *p只可读 ; p变数

int * const p // *p变数 ; p只可读

const int * const p // p和*p都只可读

int const * const p // p和*p都只可读

#static

先来看个简单的小例子:

-(void) noStatic {
    
    int a = 0;
    
    a++;
    
    NSLog(@"a = %d",a);
}

然後 viewDidLoad 执行5次

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self noStatic];
    [self noStatic];
    [self noStatic];
    [self noStatic];
    [self noStatic];
}

结果:

2021-09-17 11:02:30.057137+0800 TestOC[71225:1637744] a = 1
2021-09-17 11:02:30.057301+0800 TestOC[71225:1637744] a = 1
2021-09-17 11:02:30.057429+0800 TestOC[71225:1637744] a = 1
2021-09-17 11:02:30.057541+0800 TestOC[71225:1637744] a = 1
2021-09-17 11:02:30.057633+0800 TestOC[71225:1637744] a = 1

可以发现到每次执行 noStatic 时,a 都是全新的变数,系统分配不同的记忆体位址给 a,因此 a 都是 1。

那如果加上 static 呢?

-(void) haveStatic {
    
    static int a = 0;
    
    a++;
    
    NSLog(@"a = %d",a);
}

@end

一样执行 5 次,来看结果

2021-09-17 11:07:10.027838+0800 TestOC[71247:1640410] a = 1
2021-09-17 11:07:10.027932+0800 TestOC[71247:1640410] a = 2
2021-09-17 11:07:10.027995+0800 TestOC[71247:1640410] a = 3
2021-09-17 11:07:10.028055+0800 TestOC[71247:1640410] a = 4
2021-09-17 11:07:10.028122+0800 TestOC[71247:1640410] a = 5

a值改变了,也意味着每次对 a 变数做存取时,系统都在同一个的记忆体位址做操作,因此 a 值才会越来越多。同时也代表 a 只初始化一次,一份记忆体位置。


#extern

主要作用是宣告外部全域性变数,注意!extern 只能宣告,不能用於实现。
在开发中,常单独使用一个类来管理全域变数或常量。
我们可以在.h档中 extern宣告全域变数

//宣告全域变数
extern NSString * const name;
extern NSInteger const count;

然後在 .m档中去实现

#import <Foundation/Foundation.h>
//实现
NSString * const name = @"tom";
NSInteger const count = 3;

这样只要汇入标头档案,就可以使用全域变数。


#参考资料

http://xcodertw.blogspot.com/2013/08/objective-c-static.html
https://codertw.com/ios/326890/


<<:  终於...下载到了比赛的资料了.....

>>:  【Day02-尺度】40°C为什麽不是20°C的两倍?

【LeetCode】Monotonic Stack

monotonic :单调,递增或递减 这是一个看起来很简单的资料结构, 拥有 O(N) time ...

Day#23 github连结先来

先丢github连结!晚点再补内容呜呜呜 居然还有300字以上的限制XDD ProfileViewC...

[Day07] Service 与 Dependency Injection (依赖注入)

什麽是依赖注入 在说明什麽是 Dependency Injection(DI, 依赖注入)前,要先来...

Day 7:How do you turn this on? KMM是如何做到的?

Keyword: KMM shared module, Expect/Actual 今天我们来看看范...

【Day3】前端React +Antd 的环境(Docker化)建立 (上)

1.前端的建立过程(上): 我是在本机电脑运行起来本地版本 Container 的静态前端 Serv...