【问题标题】:MACRO Function doesn't return an objective C object [closed]MACRO 函数不返回目标 C 对象 [关闭]
【发布时间】:2013-09-04 17:57:44
【问题描述】:

我正在定义一个MACRO 函数来返回一个NSDictionary 对象。这是我尝试过的代码

#define GetDictionary(name,description,imageName) [NSDictionary dictionaryWithObjects:@[name,description,imageName] forKeys:@[ATTRIBUTE_TITLE,ATTRIBUTE_DESCRIPTION,ATTRIBUTE_IMAGE_NAME]]

#define GetDictionary(name,description,imageName) @{ATTRIBUTE_TITLE:name,ATTRIBUTE_DESCRIPTION:description,ATTRIBUTE_IMAGE_NAME:imageName}

但是当我尝试调用此方法来获取字典对象时,编译器会给出错误“void * 类型的集合元素不是目标 c 对象”。我们将不胜感激。

【问题讨论】:

  • 显示调用这些宏的代码并显示宏中使用的其他常量的定义。
  • 宏不是函数。它们是在编译时转换代码的机制。

标签: ios objective-c c macros


【解决方案1】:

首先,如果可能,请避免使用此类宏。它们往往会引起这些类型的头痛。我假设您还有更多用于ATTRIBUTE_TITLE 等的宏。我强烈建议您使用简单的函数而不是宏。你会得到更容易理解的代码。很少有理由以这种方式使用宏。

我的第一个怀疑是ATTRIBUTE_TITLE(或相关的宏之一)不是一个合适的对象。你很可能做过类似的事情:

#define ATTRIBUTE_TITLE "foo"

而不是

#define ATTRIBUTE_TITLE @"foo"

尽管void* 的投诉很有趣……无论如何,将其切换为函数,并将ATTRIBUTE_* 更改为常量而不是宏,可能会使错误变得明显。

【讨论】:

  • 使用 NULL 参数调用宏:GetDictionary(@"name", @"desc", NULL) 或将 ATTRIBUTE_* 宏之一定义为 NULL 将导致问题中给出的错误消息。
  • 谢谢;是的,NULL 听起来确实比 cstring 更有可能(因为 NULLvoid*)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2022-06-11
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2018-06-22
相关资源
最近更新 更多