当前位置: 首页 > news >正文

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

转自cocoaChina

一、前言

对于刚入行的新手们这些关键字可能会经常搞混淆或不清楚它们的意思和用法吧,即使在网上看了区别,但是很久不用下次又不清楚了,而且即使清楚自己的代码恐怕也很少用起来吧。通过阅读别人优秀的代码总会发现一些常用的关键字,随着自己的编程经验的积累慢慢的明白的。废话不多说,下面将是我的理解,若有不对,请大神赐教。

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

1、const

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

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

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

下面举个最简单的例子:

//声明一个int类型的变量a,变量初始化值为10,并且变量a左边有一个const关键字修饰

int  const  a = 10;

//因为变量a被const修饰,就成为了只读,不能被修改赋值了,所以下面这行代码是错误的

a = 20;//错误代码

const  int   a = 10; =======等价于======== int  const  a = 10;

下面再看一组练习,这组练习完成后,相信你就完全理解const的用法:

分别指出下面四行代码中 *p 和p是只读还是变量

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

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

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

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

const的常用用法:

//定义一个全局只读变量

NSString  * const Kname = @"appkey";

//static修饰后此全局变量只能本文件访问

static NSString *const Key = @"hddjj”;

2、static

这个单词翻译成中文是“静态”的意思。关从字面上理解还真没法跟他的作用关联起来,下面我们直接先看他的作用:

(1)修饰局部变量

保证局部变量永远只初始化一次,在程序的运行过程中永远只有一份内存,  生命周期类似全局变量了,但是作用域不变。这句话怎么理解呢?还是以代码例子来讲解吧。

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

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

点击事件

输出日志如下:

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

输出日志

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

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

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

点击事件

输出日志如下:

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

输出日志

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

(2)修饰全局变量

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

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

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

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

单例

(3)修饰函数

static修饰函数时,被修饰的函数被称为静态函数,使得外部文件无法访问这个函数,仅本文件可以访问。这个在oc语言开发中几乎很少用,c语言倒是能看到一些影子,所以不详细探讨。

3、extern

这个单词翻译过来是“外面的、外部的”。顾名思义,它的作用是声明外部全局变量。这里需要特别注意extern只能声明,不能用于实现,而且定义和分配内存都在原来类中。

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

定义

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

声明

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

输出日志

4、UIKIT_EXTERN

如果多个.m文件需要用到myURL,可以在每一个.m文件都像下面这样初始化吗?

NSString * const myURL = @"http://xxx.xxx.xxx.xxx:8090";

肯定不行,编译时,会报重复定义.比如在pch文件中写上面这行代码,就相当于为每一个.m文件都写这行代码

要解决重复定义的问题,可以参照苹果的做法,比如系统预置的通知

UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification;

UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification;

UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification;

UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification;// UIKIT_EXTERN,是经过处理的extern

iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法

(PS:其实也可以用static修饰全局变量,表明该全局变量只对当前文件可见,但是不建议这么做,每个.m文件都这么做,比较浪费内存)

5、总结

当然,还有很多常见的关键字,后面见到了比较有价值的会继续补充。本篇到此结束,如有疏漏,望请指正!

转载于:https://www.cnblogs.com/weicyNo-1/p/9224069.html

相关文章:

  • cocos2d-x编译android心得
  • canvas图像绘制过程中的注意
  • 老板说你的UI设计的不高级?你肯定没用这7个技巧...
  • 【IOS】如何在cocos2d 游戏中添加 移动广告
  • python笔记七之操作MySQL、excel、Redis开发接口
  • C++解析二
  • cocos2dx在windows下开发,编译到android上
  • cocos2dx在xcode下开发,编译到android上
  • 事件流和初识Jquery
  • 如何把安卓模拟器上的程序删除
  • 数据压缩算法---霍夫曼编码的分析与实现
  • 缺陷管理的分级(二)
  • C# LINQ(7)
  • redis数据类型的使用和介绍
  • 关于小电脑研制与经营的研究报告
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Angular6错误 Service: No provider for Renderer2
  • Docker 笔记(2):Dockerfile
  • ES6 ...操作符
  • Git 使用集
  • github指令
  • Java小白进阶笔记(3)-初级面向对象
  • k8s 面向应用开发者的基础命令
  • Odoo domain写法及运用
  • php面试题 汇集2
  • Rancher如何对接Ceph-RBD块存储
  • springMvc学习笔记(2)
  • Web标准制定过程
  • 笨办法学C 练习34:动态数组
  • 分布式任务队列Celery
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 汉诺塔算法
  • 小程序01:wepy框架整合iview webapp UI
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • Semaphore
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ###STL(标准模板库)
  • $.proxy和$.extend
  • (1)虚拟机的安装与使用,linux系统安装
  • (2015)JS ES6 必知的十个 特性
  • (3)llvm ir转换过程
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (floyd+补集) poj 3275
  • (二)linux使用docker容器运行mysql
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .NET CORE Aws S3 使用
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET中 MVC 工厂模式浅析
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d