【问题标题】:How to i convert a method to a MACRO in objective C如何在目标 C 中将方法转换为 MACRO
【发布时间】:2012-07-31 23:03:06
【问题描述】:

我有这种方法,它基本上将字母添加到数组中的内容中(演示)

- (NSMutableArray *) addTheLetterZ:(NSArray *)array {
    NSMutableArray *addedLetterArray = [[NSMutableArray alloc] init];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [addedLetterArray addObject:[NSString stringWithFormat:@"%@ Y", obj]];
    }];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [addedLetterArray addObject:[NSString stringWithFormat:@"%@ Z", obj]];
    }];
    return addedLetterArray;
}

我有两个疑问:

  1. 任何方法都可以转成宏吗?

  2. 将函数转换为宏时是否有一般的经验法则?

    我查看了其他 questions,但即使在他们的解决方案中,当我尝试使用 do-loop 解决方案将此方法转换为宏时也会出错。

【问题讨论】:

    标签: objective-c c macros


    【解决方案1】:

    你是说 C 宏吗?

    #define macro_name(array, addedLetterArray, str)                        \
         [(array) enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { \
            [(addedLetterArray) addObject:[NSString stringWithFormat:(str), obj]]; \
        }];
    
    - (NSMutableArray *) addTheLetterZ:(NSArray *)array {
        NSMutableArray *addedLetterArray = [[NSMutableArray alloc] init];
        macro_name(array, addedLetterArray, @"%@ Y")
        macro_name(array, addedLetterArray, @"%@ Z")
        return addedLetterArray;
    }
    

    对吗?

    【讨论】:

      【解决方案2】:

      您发布的链接是编写多行宏的正确方法。回答您的问题:

      1. 可以将任意数量的代码行转换为宏,包括方法。宏就像编辑器中的剪切和粘贴。
      2. 使用宏有很多陷阱。该参考资料至少描述了 4 种方式macros are evil。

      如果您遇到问题,最好的方法是发布您对“宏观化”的尝试。

      但是:几乎不存在应该使用宏来替换函数或方法调用的情况。 大多数情况下,使用宏的原因是错误的。例如,如果您正在重复一堆只有几行长的代码,并且您认为将这些行替换为宏而不是函数调用会更有效,那么您通常会出错。现代编译器在确定何时应内联函数方面非常有效,并有效地为您提供了与宏相同的优点而没有缺点。宏不支持类型检查等编译器,容易出错,并且更难编写。

      我不确定您的想法,但这里有一个来自您自己的代码的示例,说明如何使用函数而不是宏:

      void AddLetterToArray(NSArray *array, NSMutableArray *addedLetterArray, NSString *aLetter)
      {
          [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
              [addedLetterArray addObject:[NSString stringWithFormat:@"%@ %@", obj, aLetter]];
          }];
      }
      
      - (NSMutableArray *) addTheLetterZ:(NSArray *)array {
          NSMutableArray *addedLetterArray = [[NSMutableArray alloc] init];
          AddLetterToArray(array, addedLetterArray, @"Y");
          AddLetterToArray(array, addedLetterArray, @"Z");
          // ...
          return addedLetterArray;
      }
      

      【讨论】:

      • 看来你是对的,我使用的宏不正确。你提供的那个链接很有帮助
      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多