【问题标题】:Is it possible to create custom directives in Objective-C?是否可以在 Objective-C 中创建自定义指令?
【发布时间】:2011-02-12 00:35:38
【问题描述】:

Objective-C 有如下指令:

  • @接口
  • @实现
  • @end
  • @协议
  • @property
  • @synthesize

我认为这些东西就像复杂的 marco 或代码生成器。是否可以为代码生成目的创建自定义指令?一种可能的用途是为 CoreData 生成方法。

我不这么认为,因为我从未见过任何关于它的东西,但我的世界不是世界。


后续问题:

Jonathan 在下面提到,可以编写自己的预处理器,这引出了如何做的问题。目前,#define SYMBOLIC_CONSTANT 102 将在文件移动到编译器之前将文件中字符 SYMBOLIC_CONSTANT 的所有实例替换为字符 102。

我知道 XCode,您可以将“运行脚本阶段”添加到 Targets 构建过程。所以我可以编写一个脚本来查找我的自定义预处理指令,如“$coredata”,然后让脚本生成一个新文件,其中字符 $coredata 替换为一些代码字符。但是根据我对 XCode 构建过程的了解,您无法将更改的文件输入到编译器源阶段。这些文件由 IDE 指定并锁定。

有没有人做过类似的事情?我知道使用外部构建系统是可能的,但老实说,我还没有达到那种理解水平。我不知道 Build and Run 按钮的技术细节。

与此同时,我将开始阅读 Apple 的 XCode 文档...

感谢您的回复!

【问题讨论】:

  • 我并没有说这会很容易。但是,$coredata 之类的东西是一个有效的 C 预处理器标记($ 可以用在符号/宏名称中),所以它可以用在#define 语句中。不过,再次重申,如果您告诉我们您的目标,我们或许可以建议一种更简单或更好的方法来解决问题。

标签: objective-c xcode


【解决方案1】:

虽然公认的答案是正确的,但libextobjc 库采用了针对此类问题的部分hacky 解决方案。考虑this code,您会在那里找到如下定义:

#define weakify(...) \
    try {} @finally {} \
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__)

这样的定义允许使用weakify关键字,形式如下:

id foo = [[NSObject alloc] init];
id bar = [[NSObject alloc] init];

@weakify(foo, bar);

图书馆作者解释here

因为宏旨在与它们前面的@一起使用 (如@strongify(self);),try {} 会吸收符号,因此它不会 导致语法错误。


稍后更新

From now on libextobjc 使用@autoreleasepool 来“吸收符号”。

【讨论】:

  • *叹息,用可怕的hack-ory很好的解释
【解决方案2】:

您的想法是正确的:在您的代码中不可能做到这一点。添加更多@-directives 的唯一方法是通过编译器本身。即使你遇到了这么多麻烦,我几乎可以保证对它们的语法高亮支持被硬编码到某个 Xcode 配置文件中。

哦,如果您正在考虑使用预处理器宏,我的理解是,@ 字符在预处理器宏中是非法的。

编辑:我进行了测试,我是正确的。在 C 预处理器宏中使用 @ 字符是非法的。它们遵循与变量名称相同的规则。

【讨论】:

  • 我没有提到使用预处理器宏。重新阅读我的答案。
【解决方案3】:

您的意思是在 Objective-C 的范围内?不,因为它无法识别您的新关键字。您可以编写一个预处理器来检测@whatever 并将其转换为代码,但如果您告诉我们您具体想做什么,我们或许可以提出更有效或最优的方法。

【讨论】:

  • @ 字符在 C 预处理器宏中是非法的。
  • 感谢您的回复。你给了我如何做到这一点的想法。忘了你不需要语言钩子来生成代码。
  • @Carter:我说的是编写一个预处理器而不是使用内置的。并不是说我想使用需要自己的自定义预处理器的代码。 (哦,等等,我每天都在使用 Objective-C……)
  • 对造成的误解深表歉意... :-)
【解决方案4】:

这是不可能的。这些是 Objective-C 语言中内置的关键字。仅仅因为它们前面有一个@ 并不会使它们与其他关键字不同。

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多