关于extern、UIKIT_EXTERN、const、宏define的辨析

在iOS的源码查看中,经常看到extern、UIKIT_EXTERN、const等的身影,对这些熟悉的陌生人,所以就来学习一下,方便自己以后灵活选择与使用。

extern

作用是在代码编译时,告诉编译器,extern定义的变量已经被添加到了全局符号表中,你接下来遇到该变量时,予以语法通过,不要报错说未定义。当编译器链接二进制文件,在其它文件中找到该变量声明时,就可以顺利的完成程序的链接。类似于信用卡的感觉,先消费,后还款。


UIKIT_EXTERN

UIKIT_EXTERN是对extern关键字在Objective-C中的补充增强。查看Apple源码:

#ifdef __cplusplus
#define UIKIT_EXTERN		extern "C" __attribute__((visibility ("default")))
#else
#define UIKIT_EXTERN	        extern __attribute__((visibility ("default")))
#endif

其中,extern "C"是为了兼容以前的C程序, 告诉编译器按照以前C编译方式对(全局)函数或变量进行编译, 否则按照c++方式进行编译。

__attribute__的作用是设置函数、变量、类型的属性。

visibility属性是设置将本项目的函数、变量、类型作为库使用时的可见性。

所以UIKIT_EXTERN的作用就是限制了extern声明的函数、变量、类型的可见性,防止库外的文件可以调用到UIKIT_EXTERN修饰的内容函数、变量、类型。


const

const是常量声明,保证其不可修改。需要区分的是const位置不同的效果:

const NSString *text = @"abc";  //*text指针不能修改,text可以修改。

NSString * const text = @"abc"; //*text指针可以修改,text不能修改。

所以如果声明不可变的常量时,使用:NSString * const CONST_TEXT


#define

作用是在预编译期,进行文本替换。常见写法:

#define text @"Hello_World"     //不推荐这种不可变的定义
#define UIColorMake(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]

在定义程序里不可变的常量时,常用的define的方式。其实查看苹果的源码,其实并没有看见这样的做法,而使用const的方式。而对函数来说,则推荐使用define来重新定义函数。


举个栗子:

//--------------ExConst.h文件--------------
#import <UIKit/UIKit.h>

#define UIColorMake(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]

UIKIT_EXTERN NSString * const BASE_URL;

UIKIT_EXTERN CGFloat const BASE_VERSION;

------------------------------------------------

//--------------ExConst.m文件--------------
#import "ExConst.h"

NSString * const BASE_URL = @"https://www.github.com";
CGFloat const BASE_VERSION = 1.0;

文章来自 http://skymonkey.cn/

高能广告区

暂无广告哦=^^=。继续看看其它文章吧!