【问题标题】:Objective c - Macro with NSDictionary as parameterObjective c - 以 NSDictionary 作为参数的宏
【发布时间】:2012-09-29 18:22:40
【问题描述】:

我有一个我只想在某些情况下执行的方法(例如我不想在调试模式下执行它..) 这个方法有两个参数: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 作为参数的宏吗?

【问题讨论】:

  • [doSomethingWithString:_STR andDictionary:_DIC] 被对象实例或类调用?
  • 那么你如何处理@"a string",因为它没有采取任何行动?它有什么用?

标签: iphone objective-c ios macros


【解决方案1】:

当然。只要您保证 _STR 评估为字符串并且 _DIC 真正评估为字典,您所做的事情就没有错。此类宏常用于调试/发布/版本条件编译。

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

【讨论】:

  • 是的,使用 __name 比 _name 用于宏更好。许多系统定义都有 _NAME 格式。
【解决方案2】:

在面向对象编程中,宏是邪恶的元素。在拥有所有 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
    }
}

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

【讨论】:

  • 废话。 Apple 的 SDK 包含数千个在 C、Objective-C、C++ 和 Objective-C++ 中工作的宏。 @Eyal 的问题不是数学问题,优先级可能会被错误的括号搞砸。而且您对宏有疑问,但支持全局变量/单例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2023-03-29
相关资源
最近更新 更多