iOS宏定义介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS宏定义介绍相关的知识,希望对你有一定的参考价值。

参考技术A

在了解宏定义的使用前,需要说明一下合理使用宏定义确实可以提高程序的可读性,但是滥用宏定义,也会带来一些害处。这里对宏定义使用的优缺点做个简单的说明:

宏可以分为两类,一类称为对象宏,一类称为函数宏

对象宏可以定义一个量,如圆周率:

通过宏可以拿到这个变量:

打印结果:

但是看一下另外一种情况:

结果如下:

为什么*2的结果不是140,是110呢?

因为前面提到过了,宏只是简单地替换,所以 2的时候,实际是30+40 2

函数宏的作用就类似于一个函数一样。如:

其结果如下:

再来看另外一个例子:

这里需要注意一个问题,如果宏太长,可以使用"/"进行换行

这样便是大大增加了可读性

在OC中使用字符串都需要使用@"",如果想直接使用字符串可以添加一个"#":

再看一个关于##的操作符,连接符##用来将两个token连接为一个token:

提到可变参数宏,其实能够想到的,最多的便是NSLog。可变参数,可以利用 VA__ARGS进行读取:

打印结果如下:

iOS 使用宏定义函数和代码块

iOS使用宏定义函数和代码块

今天在开发过程中碰到一个问题:就是父类中要向外发送通知,然后子类中或者其他类中来接收它。当然一般是把它写到类方法中去,但是有个问题,就是如果调用的类不是它的子类,就不能直接调用,当然也可以采用静态方法实现,我这里主要是想用宏定义来实现,下面我分别介绍使用宏定义函数和定义代码块的方式进行,废话不多说了,直接上代码:

  • 使用宏定义函数实现
//定义
#define SendNotification @"SendNotification"
#define sendMessage(msg) ({dispatch_async(dispatch_get_main_queue(), ^{    NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter];    [notificationCenter postNotificationName:SendNotification object:nil userInfo:@{@"msg":msg}];    });})

//使用
sendMessage(@"发个消息试试");

//有返回的宏函数定义
#define getSum(a,b) ({(a+b);})

//使用
double sum = getSum(M_PI,M_E);
  • 使用宏定义代码块实现
//定义
#define SendNotification @"SendNotification"
#define sendMessage(msg) ^(){    dispatch_async(dispatch_get_main_queue(), ^{        NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter];        [notificationCenter postNotificationName:SendNotification object:nil userInfo:@{@"msg":msg}];    });}()

//使用
sendMessage(@"发个消息试试");

//有返回的宏代码块定义
#define getSum(a,b)^(){    return a+b;}()

//使用
double sum = getSum(M_PI,M_E);
  • 写在最后,当时写的时候,想到了使用宏定义的方式,但是在网上找了一圈没有找到怎么使用宏来定义代码块和函数,于是自己通过尝试实现了,所以在这里Mark一下,希望能够帮到遇到同样问题的人,也为了以后自己忘了能够查到。

以上是关于iOS宏定义介绍的主要内容,如果未能解决你的问题,请参考以下文章

玩转iOS“宏定义”

iOS----------常见宏定义

iOS LLVM 中的宏定义

iOS 7:漫谈#define 宏定义(转)

iOS 日常工作之常用宏定义大全

iOS常用宏定义