2012-09-29 72 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