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

时间:2011-02-12 00:35:38

标签: objective-c xcode

Objective-C有如下指令:

  • @interface
  • @implementation
  • @end
  • @protocol
  • @属性
  • @synthesize

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

我想不是,因为我从来没有见过任何关于它的东西,但我的世界不是世界。


后续问题:

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

我知道XCode你可以在Targets构建过程中添加“Run Script Phase”。因此,我可以编写一个脚本来查找我的自定义预处理指令,如'$ coredata',然后让脚本生成一个新文件,其中字符$ coredata替换为某些代码字符。但根据我对XCode构建过程的理解,您无法将更改的文件提供给Compiler Sources阶段。这些文件由IDE指定并锁定。

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

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

感谢您的回复!

4 个答案:

答案 0 :(得分:5)

虽然接受的答案是正确的,但是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来“吸收符号”。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

您的想法是正确的:在您的代码中无法执行此操作。添加更多@ - 指令的唯一方法是通过编译器本身。即使您遇到了所有麻烦,我几乎可以保证突出显示对它们的支持的语法被硬编码到某个地方的Xcode配置文件中。

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

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

答案 3 :(得分:0)

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