文档章节

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

召唤攻城狮
 召唤攻城狮
发布于 2014/04/27 20:30
字数 914
阅读 6467
收藏 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,有兴趣的可以加群进来相互交流。

© 著作权归作者所有

共有 人打赏支持
召唤攻城狮
粉丝 184
博文 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使用Objective-c自定义cordova插件(-)

本系列教程为博主初次使用开发,内容如有差错,欢迎指正,敬请谅解。 博客地址:http://blog.img421.com/iosshi-yong-object-czi-ding-yi-cordovacha-jian/ Mac安装ionic和cordova我们已经熟悉,...

Michaelyn
2017/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
4
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
5
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
165
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部