00『 基础知识 』iOS DeveloperiOS开发

iOS开发中你真的会用#define么!!!?

2016-08-26  本文已影响7021人  ZeroJ

前言:

不得不说在C系语言(C, Objective-C, C++...)中宏(macro)是个强大的东西, 虽然在基本的语法上面看上去是非常的简单, 不过有时候正因为他的强大和方便, 就会导致在使用的时候, 其中会有很多的注意点, 如果不小心被忽略, 那么将会带来完全不想要的结果. 所以要想灵活的使用它, 那么还是先了解一些比较好. 而且在iOS开发中如果你是使用OC, 那么你可能经常会使用到#define(swift当前不支持宏)

首先扔出几个宏的定义,调用这些宏的时候分别是什么结果, 看看你能够在不看后面的情况下, 清楚多少, 当然, 如果很清楚, 自然可以忽略后文的八卦了..., 因为, 你绝对比我更了解宏...

  1. #define PI 3.14
这里先不解释上面定义的几个宏了, 首先介绍下宏的一些基本东西
Snip20160826_1.png
对于宏的基本的东西就介绍到这里了, 还有一些相关的东西就在下面解释一下上面定义的几个宏的过程中提到
float computeAreaWithRadius(float r) {
    return PI * r * r;
}
#define log(x) printf("this is test: x = %d", x)
int main(int argc, const char * argv[]) {
        
    int y = 12;
    log(y); // 输出为  this is test: x = 12
}
#define log(x) printf("this is test: "#x" = %d", x)
int main(int argc, const char * argv[]) {
    int y = 12;
    log(y); 
// 输出为  this is test: y = 12 (而不是 x = 12, 或者 12 = 12)
// 因为使用#和参数结合可以被替换为宏参数对应的字符串, "#x"表示字符串x, 这里输入的参数为y, 则替换为y(不是12)
  log(2+4)// 输出为 this is test: 2+4 = 6
}
    #define power(x) x*x
    int x = 2;
    int pow1 = power(x); // pow1 = 2*2 = 4
    int pow2 = power(x+1); //  pow2 = 3 * 3 = 9  ??
    // 显然对于pow1 = 4是没有问题的
    // 不过对于pow2 = 9 这个结果是有问题的, 定义的宏并没有达到我们预想的效果 结果为 3*3
    // 因为: 上面提到过宏是直接的代码替换, 这里宏展开后就成为了 x+1*x+1 = 2+1*2+1 = 5
    // 这里因为运算优先级的原因导致结果的不一样, 所以pow应该(加上括号)定义为
  #define power(x) (x)*(x)
#define print(...) printf(__VA_ARGS__)
int main(int argc, const char * argv[]) {
  print("测试可变参数 ---- %d", 12); // 输出结果为: 测试可变参数 ---- 12
}
#define weakify( x ) autoreleasepool{} __weak typeof(x) weak##x = x;
加上 autoreleasepool{}使用宏的时候就应该加上@
像这样: 
- (void)delay {
    @weakify(self)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [weakself test];
    });
}
当然如果你没有加autoreleasepool{}, 使用宏就不用加上@了
#define weakify( x ) __weak typeof(x) weak##x = x;
像这样: 
- (void)delay {
    weakify(self)
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [weakself test];
    });
}

😄这里关于宏的介绍就先这样了, 使用宏很多时候可以让我们的代码更容易阅读和修改, 同时也可以少写很多的重复代码, 希望你在使用C系语言开发的时候能够好好利用这个方便的东西, 如果你使用OC开发iOS那么宏对你而言也会是一大福利, 如果使用swift开发iOS, 那么... 目前swift是不支持宏定义的, 不过可以使用全局的常量和全局函数来替换一部分宏的功能

上一篇 下一篇

猜你喜欢

热点阅读