是否可以在Objective-C中创建自定义指令?

问题描述:

Objective-C中有类似的指令:是否可以在Objective-C中创建自定义指令?

  • @interface
  • @implementation
  • @end
  • @protocol
  • @property
  • @synthesize

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

我在想没有,因为我从来没有见过它,但我的世界不是这个世界。


的后续问题:

乔纳森下文提到的,这是可以编写自己的预处理器,这回避了如何的问题。目前,#define SYMBOLIC_CONSTANT 102将在文件移动到编译器之前,用文件中的字符102替换字符SYMBOLIC_CONSTANT的所有实例。

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

有没有人做过类似的事情?我知道使用外部构建系统是可能的,但说实话我并不是那么了解。我不知道Build和Run按钮的功能。

在此期间,我开始阅读苹果的Xcode文档...

感谢您的答复!

+0

我没有说这会很容易。然而,像`$ coredata`这样的东西是一个有效的C预处理器标记(`$`可以在符号/宏名称中使用),所以它可以在#define语句中使用。不过,如果你告诉我们你的目标,我们可能会提出一个更容易或更好的解决问题的方法。 – 2011-02-12 19:27:50

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

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

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

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

+1

@字符在C预处理器宏中是非法的。 – 2011-02-12 00:44:34

+0

感谢您的回应。你给了我如何做到这一点的想法。忘了你不需要语言钩子来生成代码。 – Tobias 2011-02-12 01:38:31

+2

@Carter:我说*写一个预处理程序*而不是*使用内置的*。不是我想要使用需要自己的自定义预处理器的代码。 (哦,等等,我每天都用Objective-C ......) – 2011-02-12 12:59:20

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

虽然接受的答案是正确的,但是对于这种问题有一个部分的解决方法,其中libextobjc库采用。考虑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

由于这些宏旨在与@pre给它们排序 (就像@strongify(self);),try {}吸收符号,所以它不会造成语法错误。


更新后

From now on libextobjc使用@autoreleasepool为 “沉浸在符号”。