文档章节

iOS开发技巧(系列六-再谈#define和预编译指令)

召唤攻城狮
 召唤攻城狮
发布于 2014/04/27 20:30
字数 914
阅读 6473
收藏 4

之前写过一篇博客,iOS深入学习:华丽的#define,列出了一些常用的#define。

今天再总结一点#define和预处理指令的使用。

预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理

预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。正行语句构成了一条预处理指令,该指令酱紫啊编译器进行编译之前对源代码做某些转换,下面是一些常用的预处理指令,

#    空指令,没有任何效果

#include 包含一个源代码文件

#define 定义宏

#undef 取消定义宏

#if 如果条件为真,则编译下面的代码

#elif 如果前面的#if不为真,则编译下面的代码

#endif 结束一个#if...#elif条件编译块

#ifdef 如果已经定义了某个宏,则编译下面的代码

#ifndef 如果没有定义某个宏,则编译下面的代码

#error 停止编译并显示错误信息


最近在看公司自己封装的sdk的时候,遇到了很多#ifdef和#ifndef,下面我就主要距离来说一说这个预处理指令的灵活使用。比如你现在通过代码创建了一个Button,

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

        btn.frame = CGRectMake(0, 0, 100, 40);

        [btn setTitle:@"BUTTON" forState:UIControlStateNormal];

        [btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:btn];

但是根据新的需求,这个Button暂时不需要显示在界面上面,这时候不可以将该Button相关的代码注释掉,这也不失为一个好方法。但是我更推荐使用预处理指令来进行条件判断,下面我使用两种方法来说明,

(1)第一种方法,定义一个具体的宏

#define Debug_ShowButton 0

{

    //创建Button对象btn

    ......//省略若干代码

#if Debut_ShowButton

    //如果需要显示按钮,那么将其添加到父视图中

    [self.view addSubview:btn];

#else

    //不将其添加到父视图中

    //[self.view addSubview:btn];

#endif

}

这时候如果想显示该Button对象,那么将#define Debug_ShowButton 1,否则写为#define Debug_ShowButton 0。

(2)第二种方法,定义一个没有数值的宏

{

#ifdef Debug_ShowButton

    [self.view addSubview:btn];

#endif

}

这段代码的意思就是如果定义了宏Debug_ShowButton,那么就将btn添加到父视图,如果没有定义的话,那么不添加到父视图。这时候如果我们想要将其添加到父视图,则在文件的顶部写上#define Debug_ShowButton,对,这时候我们可以不给这个宏指定对应的值,这个代码仅仅表示定义一个没有对应值的宏。

总结:

这两种方法,我更加推荐第二种,因为一般情况下,我们定义一个有对应数值的宏,是为了在代码中使用该数值,例如#define kStatusBarHieght 20,这样我们就可以把kStatusBarHeight作为数值在代码中使用,而第一种方法定义了有对应值的宏Debug_ShowButton,我们却没有在代码中使用它,这样是不是有点浪费呢;而使用第二种方法定义一个没有对应值的宏,它只是一个标识符,看起来简单点。我个人更加推荐第二种!


本人建了一个ios交流群188647173,有兴趣的可以加群进来相互交流。

© 著作权归作者所有

共有 人打赏支持
召唤攻城狮
粉丝 183
博文 53
码字总数 49671
作品 0
玉林
私信 提问
iOS开发,#define的使用(系列一)

1、判断当前设备是不是iOS7以上版本 #define IOSVERSION7ORABOVE (([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)? (YES):(NO)) 如果判断系统的设备在项目中使用频繁,那么...

召唤攻城狮
2014/04/10
0
0
c++学习总结:define的小细节

在iOS开发中,我们可以使用#ifdef或者#ifndef来进行一些判断,这在我之前的博客中已经有所说明。今天我无意中又发现了一个小细节,总结起来就是预编译判断的两种方式,特在此与大家分享。 (...

召唤攻城狮
2014/05/19
0
0
iOS代码运行的磨刀石-预编译指令

iOS中代码运行的磨刀石--预编译指令 所谓预编译,就是程序代码在编译之前,开发工具为我们预先做的一些工作。不要小瞧这些指令,没有它们,我们的代码可能寸步难行。 一、文件包含相关预处理...

珲少
2015/04/28
0
0
Bytom移动端钱包SDK开发基础

比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom Bytom-Mobile-Wallet-SDK 是从bytom源码中抽离出的钱包层代码,并且对钱包...

比原链Bytom
09/10
0
0
iOS源码补完计划--AFNetworking(二)

目录 前言 AFNetworkReachabilityManager.h AFNetworkReachabilityManager.m API注释Demo 参考资料 前言 AFNetworking源码第二篇 主要看了看AFNetworkReachabilityManager的内容 作为一个辅助...

kirito_song
05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MariaDB 服务器在 MySQL Workbench 备份数据的时候出错如何解决

服务器是运行在 MariaDB 10.2 上面的,在使用 MySQL Workbench 出现错误: mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"'......

honeymose
今天
2
0
apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
6
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
12
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
4
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部