2

特定の場合にのみ実行したいメソッドがあります (たとえば、デバッグ モードで実行したくないなど)。このメソッドには次の 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文字列に_DICeval し、辞書に本当に eval することを保証する限り、あなたがしていることに何の問題もありません。このタイプのマクロは、デバッグ/リリース/バージョンの条件付きコンパイルによく使用されます。

ところで、最近の 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 に答える