如何在目标C中将方法转换为MACRO

时间:2012-07-31 23:03:07

标签: objective-c c macros

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

- (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解决方案将此方法转换为宏时,我也会收到错误。

2 个答案:

答案 0 :(得分:2)

你的意思是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;
}

正确?

答案 1 :(得分:1)

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

  1. 可以将任意数量的代码行转换为宏,包括方法。宏就像编辑器中的剪切和粘贴一样。
  2. 使用宏有很多陷阱。此参考文献至少描述了4种方式macros are evil
  3. 如果您遇到问题,最好的方法是将您的尝试发布到“宏观化”。

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

    我不确定你的想法,但这里有一个关于你如何使用函数而不是宏的代码示例:

    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;
    }