2

我有一个我只想在某些情况下执行的方法(例如我不想在调试模式下执行它。)这个方法有两个参数:NSStringNSDictionary

例如这个类方法:

+ (void)doSomethingWithString:(NSString *)str andDictionary:(NSDictionary *)dic; 

所以我想定义一个宏,并在不需要时禁用它。
像这样的东西:

#define METHOD_ENABLED 

#ifdef METHOD_ENABLED
    #define MACRO_METHOD(_STR, _DIC) [SomeClass doSomethingWithString:_STR andDictionary:_DIC];
#else
    #define MACRO_METHOD(_STR, _DIC)
#endif

并使用它我调用:

MACRO_METHOD(@"a string", [NSDictionary dictionaryWithObject:@"object" forKey:@"key]);

这是我应该怎么做的吗?我什至可以有一个以 NSDictionary 作为参数的宏吗?

4

2 回答 2

4

当然。只要您保证_STR对字符串进行评估并_DIC真正对字典进行评估,那么您所做的事情就没有错。这种类型的宏通常用于调试/发布/版本条件编译。

顺便说一句,使用最近的 Clang 编译器,您可以简化[NSDictionary dictionaryWithObject:@"object" forKey:@"key"]@{@"key":@"object"}

于 2012-09-29T18:56:41.527 回答
0

在面向对象编程中,宏是邪恶的元素。在拥有所有 OOAD 技术的同时使用宏是一种不好的方法。如果您真的必须坚持使用宏,我会这样做:

在一些全局单例中设置设置:

globals.needToDoSomethingWithStringAndDictionary = MACRO_ENABLED; // where macro is bool

然后在您可能需要调用的任何地方:

[SomeClass doSomethingWithString: aString andDictionary: aDictionary];

而守卫在方法之内:

+(void) doSomethingWithString aString andDictionary: aDictionary
{
   if ([globals sharedGlobals].needToDoSomethingWithStringAndDictionary)
    {
    // do your stuff
    }
}

这使您可以在调试时完全控制代码,并使您的代码维护变得容易!

于 2012-09-29T19:13:25.963 回答