iOS中#define、static、const关键字

  • C语言中#define 宏定义的命令

  • 只是在预处理阶段对用#define 所定义的内容进行替换,不会检查数据类型
  • 讲的好的原文链接: iOS开发中你会用#define么?
  • C 语言中的全局变量和局部变量

    • 全局变量和局部变量是按照变量的作用域来划分的。简单地说,局部变量是定义在函数内部的变量;全局变量是定义在函数之外的变量。全局变量可以为当前文件中其他函数所共用。
    • 在 C 语言中全局变量和局部变量可以重名,并且局部变量会屏蔽全局变量。因为他们的作用域不同。在函数内,默认使用的是局部变量。

全局变量和局部变量的内存存放
全局变量储存在静态数据库中,局部变量储存在堆栈中。全局变量在程序开始执行时分配存储区,程序执行完毕释放,在程序执行过程中全局变量始终占据固定的存储单元;局部变量是动态分配存储空间的,在调用变量所在函数时,系统会给函数内的局部变量分配存储空间,在函数结束时自动释放这些存储空间。

iOS 技术学习群号:529560119 ,提供各种最新权威学习书籍及开发视频
  • staitc 关键字

    C语言中的 static 关键字

    1. 函数体内,static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只会被分配一次,因此其值在下次调用时仍维持上次的值。
    • 在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外的其他函数访问。
    • 在模块内的 static 函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。
#include <stdio.h>

static int i;
void fun1(void){
    i = 0;
    i++;
    printf("i = %d <>",i);
}

void fun2(){
    static int j = 0;
    j++;
    printf(" j = %d\n",j);
}


int main(int argc, const char * argv[]) {
    
    int n;
    for (n = 0; n < 10; n++) {
        fun1();
        fun2();
    }
    return 0;
}

输出结果:

i = 1 <> j = 1
i = 1 <> j = 2
i = 1 <> j = 3
i = 1 <> j = 4
i = 1 <> j = 5
i = 1 <> j = 6
i = 1 <> j = 7
i = 1 <> j = 8
i = 1 <> j = 9
i = 1 <> j = 10
// 上面代码定义了一个静态全局变量 i 和静态局部变量 j 。每次调用函数的时,改变变量的值,使其累加。
// 由于 i 在每次调用函数时都被赋予了新值,所以每次的值都是1;
// j 被定义为静态局部变量,其值在每次函数结束时都会被保留,所以结果都是上次值加1。

静态全局变量只能在变量被定义的文件中使用,其他文件即使用 extern 声明也没法使用它。准确地说,作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它,想要使用就得前面再加 extern

OC语言中的 static 关键字

虽然 Objective-C 也提供了static 关键字,但这个 static 关键字不能用于修饰成员变量,它只能修饰局部变量,全局变量和函数,static 修饰局部变量表示将该局部变量存储到静态存储区;static 修饰全局变量用于限制该全局变量只能在当前源文件中访问;static 修饰函数用于限制该函数只能在当前文件中调用。

  • 成员变量 - 不能修饰成员变量。
  • 局部变量 - 可以修饰局部变量,存储到静态存储区。
    • 延长局部变量的生命周期,程序结束才会销毁。
    • 局部变量只会生成一份内存,只会初始化一次。
    • 并没有改变变量的作用域。
  • 全局变量 - 只能在当前源文件中访问
    • 使全局变量的作用域仅限于当前文件内部,即当前文件内部才能访问该全局变量。
    • 避免重复定义全局变量。
@implementation LoginTool

//static修饰全局变量,让外界文件无法访问
static LoginTool *_sharedManager = nil;

+ (LoginTool *)sharedManager {
     static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _sharedManager = [[self alloc] init];
    });
    return _sharedManager;
} 
// iOS中在一个文件声明的全局变量,工程的其他文件也是能访问的,
// 但是我又不想让其他文件访问,这时就可以用static修饰它了,
// 比较典型的是使用GCD一次性函数创建的单例,全局变量基本上都会用static修饰。
  • 函数 - 该函数只能在当前源文件中访问
  • const 关键字

const 字面意思,只读、常量的意思,用来修饰右边的变量或指针,值不能改变。指定变量不可被当前线程/进程改变(但有可能被系统
或其他线程/进程改变)。

  1. 要阻止一个变量的值被改变,可以使用 const 关键字,在定义 const 变量时,通常要对它进行初始化,因为以后就没有机会去改变它了。
  2. 对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或者二者同时指定为 const。
  3. 在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能修改其值。

const 作用

-   可以定义const常量,具有不可变性。 例如:
const int Max=100; int Array[Max];```
    -  便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
``` void fun(const int i) { .........} ```
例如:  编译器就会知道i是一个常量,不允许修改;

    - 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在 函数体内修改了i,编译器就会报错;

void fun(const int i) {
i=10;//error!
}

     - 可以节省空间,避免不必要的内存分配。 例如:

define PI 3.14159 //常量宏

const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是 立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存 中有若干个拷贝。

    -  提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

####const 实际使用

  - 修饰一般常量 一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类 型说明符前,也可以用在类型说明符后。
例如:

int const x=2; 或 const int x=2;

(当然,我们可以偷梁换柱进行更新: 通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值。)

![WX20170224-144314.png](http://upload-images.jianshu.io/upload_images/749242-5118852065d7256e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

   - 修饰常数组(值不能够再改变了) 定义或说明一个常数组可采用如下格式:

int const a[5]={1, 2, 3, 4, 5};
const int a[5]={1, 2, 3, 4, 5};


  ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/749242-3de463270349b0bc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

   -  修饰函数的常参数 const修饰符也可以修饰函数的传递参数,格式如下:

void Fun(const int Var);

告诉编译器Var在函数体中的无法改变,从而防止了使用者的一些无 意的或错误的修改。
   - 修饰函数的返回值: const修饰符也可以修饰函数的返回值,是返回值不可被改变,格式如下:

const int Fun1();
const MyClass Fun2();


- 修饰常指针
>const int *A;    //const修饰指针,A可变,A指向的值不能被修改

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/749242-3f5d4b2ff0045072.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

> int const *A; //const修饰指向的对象,A可变,A指向的对象不可变




![Paste_Image.png](http://upload-images.jianshu.io/upload_images/749242-02f25a2030ad7477.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


>int *const A; //const修饰指针A, A不可变,A指向的对象可变



![Paste_Image.png](http://upload-images.jianshu.io/upload_images/749242-b25884e0e8928af1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



>const int *const A;//指针A和A指向的对象都不可变


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/749242-68662ec73e9ed37c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



//技巧: 先看“*”的位置
// 如果const 在 *的左侧 表示值不能修改,但是指向可以改。
// 如果const 在 的右侧 表示指向不能改,但是值可以改
// 如果在“
”的两侧都有const 标识指向和值都不能改。


更多精彩,关注群号:529560119
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容