在看一些高手所写的代码时,总是可以看到我们小白平常不用的关键字,一次,两次,三次,不能总是不明不白,现在总结一下日常开发中常用的关键字的作用:

关键字const/static/extern的释义和用法

1. const

这个单词翻译成中文就是 “常量”的意思。在程序中我们知道常量的值是不能变的,固定的。所以const关键字的作用就是:

(1) const用来修饰右边的基本变量或指针变量

(2)被修饰的变量只读,不能被修改

下面举一个简单的例子:

 //声明一个int类型的变量a 初始化值为10 并且a被const关键字修饰
int const a = ;
//因为a被const修饰 所以变成只读 在做修改会报错
// a= 20;//(这句代码会报错)
//上面的代码等价于
//const int a = 10;
NSLog(@"Hello, World!");

在看一下下面的总结

int  const  *p   //  *p只读 ;p变量
int * const p // *p变量 ; p只读
const int * const p //p和*p都只读
int const * const p //p和*p都只读

注:判断p和p是只读还是变量 关键是看const在谁前面。如果只在p前面,那么p只读 *p还是变量; 如果在*p前面,p是变量 *p是只读。

2.static

这个单词翻译成中文是"静态"的意思,只从字面上理解是没有办法窥探他的作用的。下面我们直接先看他的作用:

(1)修饰局部变量

保证局部变量永远只初始化一次,在程序运行中永远只有一份内存,生命周期类似于全局变量了。但是作用域不变。这句话怎么理解呢 上个例子就明白了.

随便建一个工程,在一个控制器类上监听控制器view的点击事件方法:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ //声明一个局部变量i
int i = ; //每次点击view来到这个方法时让i自增
i ++; //打印结果
NSLog(@"i=%d",i);
}

输出日志如下:

-- ::48.290 fff[:] i=
-- ::49.044 fff[:] i=
-- ::49.200 fff[:] i=....

从输出日志中我们可以看到i一直等于1,这也是预料之中的,因为每次点击进入这个方法就会重新初始化一个全新的变量i = 0,加加了一次后值变为1,然后打印出结果为1,出了这个方法后局部变量i就被释放回收。所以每次打印出来的结果都为1。

但是 我们再看看局部变量i被关键字static修饰后的情况:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ //声明一个局部变量i
static int i = ; //每次点击view来到这个方法时让i自增
i ++; //打印结果
NSLog(@"i=%d",i);
}

输出日志如下:

-- ::34.276 fff[:] i=
-- ::35.347 fff[:] i=
-- ::35.761 fff[:] i=
-- ::36.057 fff[:] i=
-- ::36.415 fff[:] i=....

从上面的日志中可以看出i的值一直在自增,什么?他难道不是每次进去都被初始化赋值为0了吗?怎么会累加呢?这就是关键字static修饰局部变量的作用,让局部变量永远只初始化一次,一份内存,生命周期已经跟全局变量类似了,只是作用域不变。

(2)修饰全局变量

使全局变量的作用域仅限于当前文件内部,即当前文件内部才能访问该全局变量。

iOS中在一个文件中声明的全局变量,工程中的其它文件也是能访问的,但是我又不想让其它文件访问,这时就可以用static关键字来修饰它了,比较典型的使用是GCD一次性函数创建的单例,全局变量基本上都会使用static修饰。

下面是一个使用GCD一次性函数创建的单例

@implementation LoginTool
//static修饰全局变量,让外界文件无法访问
static LoginTool *_sharedManager = nil; + (LoginTool *)sharedManager {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedManager = [[self alloc] init];
});
return _sharedManager;
}

(3)修饰函数

static修饰函数的时候,被修饰的函数成为静态函数,使得外部文件无法访问这个函数,仅本文件可以访问。

三 关键字:extern

这个单词翻译过来就是"外面的","外部的"。顾名思义,他的作用就是声明外部局部变量。这里要注意的是 extern只能声明,不能用于实现。

在开发中 我们经常会单独抽出来一个类来管理一些全局变量或者常量。下面我们来看看逼格比较高的一种做法:

我们可以在.h文件中extern声明一些全局的变量

//声明一些全局常量
extern NSString * const name;
extern NSInteger const count;

然后在.m中去实现

NSString * const name = @"王五";
NSInteger const count = ;

这样,只要导入头文件,就可以全局的使用定义的变量或者常量。

补充 使用const关键字 和 宏定义的区别

一般我们把常用的字符串变量 抽成宏,但是苹果不建议我们抽成宏,推荐我们使用const常量。

编译时刻:宏是预编译(编译之前提前处理) const 是编译阶段。

编译检查:宏不做检查,不会编译报错,只是替换;const会编译检查,会报编译错误。

宏的好处:宏能定义一些函数 方法;const 不能

宏的坏处:使用大量宏 容易造成编译时间久,每次都需要重新替换。

iOS 中 const static extern 关键字总结的更多相关文章

  1. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  2. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  3. iOS正确使用const,static,extern

    static 修饰局部变量 让局部变量只初始化一次 局部变量在程序中只有一份内存 并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁) 修饰全局变量 全局变 ...

  4. const,static,extern简介

    一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 编译时刻:宏是预编译(编译之前处理),const是编译阶段. 编 ...

  5. const,static,extern简介(重要)

    一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 编译时刻:宏是预编译(编译之前处理),const是编译 ...

  6. PHP中const,static,public,private,protected的区别

    原文地址:http://small.aiweimeng.top/index.php/archives/54.html const: 定义常量,一般定义后不可改变static: 静态,类名可以访问pub ...

  7. const ;static;extern的使用与作用

     const                                                                /**      const :常量      const  ...

  8. const static extern

    http://wenku.baidu.com/link?url=saMJ3WpR_Lili2oflaIK-xK7wkQhtP2I-FdEX6I_XjmNxl7m0Z8SYHJtfqyXYkSmok8h ...

  9. const,static,extern,#define

    一.const // 简单定义变量,可以修改变量的值 ; a = ; // const的用法 // 用法一: ; ; // 不允许修改,因为 const 修饰 b/c,指定 b/c 为常量!! // ...

随机推荐

  1. VMware: XXX is still busy. Please wait until the operation is complete before closing

      在使用vmware的过程中发现创建快照.恢复快照.管理快照等功能突然都变成灰色的,用不了.更觉得夸张的是仅仅剩下关闭虚机按钮是红色的.心想估计是虚机快照没处理完之类的问题导致的,于是想想关闭虚机重 ...

  2. 对Xcode菜单选项的详细探索(干货)

    本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到了xcode7,但是一般都只是用了一些基础的功能,说来也惭愧.在一次偶然的机遇突然发现了“显示调用层级”的选 ...

  3. OC 入门

    OC 入门 关键词正确写法: Xcode 错误的写法: xcode iPhone 错误的写法:IPhone iOS 错误的写法:IOS OC 全称: Objective-C 错误的写法:Object- ...

  4. response设置输出文件编码

    在java后台的Action代码或者Servlet代码中用response的方法来设置输出内容的编码方式,有以下三个方法: 1.response.setCharacterEncoding(" ...

  5. YUM源的简介,配置与使用

    A.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...

  6. VMware安装增强工具

    1. 开启linux,进入系统 2. 点击菜单中的"虚拟机"----"install vmware-tools" 命令 cd /mkdir /aaamkdir ...

  7. js document.createElement()的用法 (转)

    document.createElement()的用法 分析代码时,发现自己的盲点--document.createElement(),冲浪一番,总结了点经验. document.createElem ...

  8. nodejs学习笔记(1)--express安装问题:express不是内部也或者外部的命令解决方案

    "Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具.使用 Express 可以快速地搭建一个完 ...

  9. MongoDB 优点

    任何关系型数据库,具有典型的架构设计,显示表和这些表之间的关系.虽然在 MongoDB中,没有什么关系的概念. MongoDB比RDBMS的优势 架构:MongoDB是文档型数据库,其中一个集合保存不 ...

  10. Enabling Cross-Origin Requests in ASP.NET Web API 2

    Introduction This tutorial demonstrates CORS support in ASP.NET Web API. We’ll start by creating two ...