iOS开发中关键字const/static/extern、UIKIT_EXTERN的区别和用法

 更新时间:2017年12月26日 10:16:02   投稿:mrr  
这篇文章主要介绍了iOS 关键字const/static/extern、UIKIT_EXTERN区别和用法,需要的朋友可以参考下

一、前言

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

二、关键字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的点击事件方法:

 

点击事件

输出日志如下:

 

输出日志

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

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

 

点击事件

输出日志如下:

 

输出日志

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

(2)修饰全局变量

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

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

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

 

单例

(3)修饰函数

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

3、extern

这个单词翻译过来是“外面的、外部的”。顾名思义,它的作用是声明外部全局变量。这里需要特别注意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

 

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

总结

以上所述是小编给大家介绍的iOS开发中关键字const/static/extern、UIKIT_EXTERN的区别和用法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • iOS开发教程之Status Bar状态栏设置的方法汇总

    iOS开发教程之Status Bar状态栏设置的方法汇总

    iOS 的 Status Bar 状态栏是一个比较坑的地方,所以下面这篇文章主要给大家介绍了关于iOS开发教程之Status Bar状态栏设置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-08-08
  • iOS实现九宫格自动生成视图

    iOS实现九宫格自动生成视图

    这篇文章主要为大家详细介绍了iOS实现九宫格自动生成视图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • MAC 系统安装java并配置环境变量

    MAC 系统安装java并配置环境变量

    这篇文章主要介绍了MAC 系统安装java并配置环境变量的相关资料,需要的朋友可以参考下
    2017-03-03
  • iOS关联对象示例详解

    iOS关联对象示例详解

    这篇文章主要给大家介绍了关于iOS关联对象的相关资料,文中通过示例代码结束的非常详细,对大家学习或者使用iOS具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • iOS动态调整UILabel高度的几种方法

    iOS动态调整UILabel高度的几种方法

    在iOS编程中UILabel是一个常用的控件,下面这篇文章主要给大家介绍了关于iOS动态调整UILabel高度的几种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-12-12
  • 浅谈Unity中IOS Build Settings选项的作用

    浅谈Unity中IOS Build Settings选项的作用

    下面小编就为大家分享一篇浅谈Unity中IOS Build Settings选项的作用,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • iOS判断是否越狱设备方法示例

    iOS判断是否越狱设备方法示例

    这篇文章主要给大家介绍了关于iOS判断是否越狱设备的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • IOS 图文混排(CoreText.framework)详解及实例

    IOS 图文混排(CoreText.framework)详解及实例

    这篇文章主要介绍了IOS 图文混排(CoreText.framework)详解及实例的相关资料,这里对IOS 的图文混排进行了详细介绍,并附代码实例,和实现效果图,需要的朋友可以参考下
    2016-11-11
  • iOS 清除xcode缓存和生成文件的方法

    iOS 清除xcode缓存和生成文件的方法

    下面小编就为大家分享一篇iOS 清除xcode缓存和生成文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • iOS中 valueForKeyPath常用用法

    iOS中 valueForKeyPath常用用法

    这篇文章主要介绍了iOS valueForKeyPath常用用法,valueForKeyPath可以获取数组中的最小值、最大值、平均值、求和。具体实例代码大家参考下本文
    2018-08-08

最新评论