2012-09-29 44 views
1

我有一种方法,我只想在某些情况下执行(例如我不想在调试模式下执行它)。 此方法有两个参数:NSStringNSDictionary客观c - 以NSDictionary为参数的宏

例如此类方法:

+ (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作为参数的宏?

+0

[doSomethingWithString:_STR andDictionary:_DIC]被调用的对象实例或类? –

+0

类,我更新了我的问题 – Eyal

+0

所以你用@“一个字符串”做什么,因为没有采取行动?它需要什么? –

回答

4

当然。只要你保证_STR是一个字符串,并且_DIC真的可以转化为字典,那么你在做什么都没有问题。这种类型的宏通常用于调试/发布/版本条件编译。

BTW,最近锵编译器可以简化[NSDictionary dictionaryWithObject:@"object" forKey:@"key"]@{@"key":@"object"}

+0

是的,使用__name比宏命名更好_name。许多系统定义都有_NAME格式。 –

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

这使您可以完全控制代码,同时调试并使您的代码维护变得简单!

+0

废话。 Apple的SDK包含数千个可在C,Objective-C,C++和Objective-C++中工作的宏。 @ Eyal的问题不是一个数学问题,其优先级可能与错误的括号混淆。你有一个宏的问题,但支持一个全局变量/单身? – rsswtmr