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

Tob*_*ias 7 xcode objective-c

Objective-C有如下指令:

  • @接口
  • @implementation
  • @结束
  • @协议
  • @属性
  • @合成

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

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


后续问题:

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

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

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

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

谢谢你的回复!

Sta*_*ich 5

虽然接受的答案是正确的,但是libextobjc库采用了这种问题的部分hacky解决方案.考虑一下这段代码,你会发现如下的定义:

#define weakify(...) \
    try {} @finally {} \
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

此类定义允许使用weakify以下形式的关键字:

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

@weakify(foo, bar);
Run Code Online (Sandbox Code Playgroud)

图书馆的作者在这里解释:

由于这些宏旨在与@之前的@一起使用(如@strongify(self);),因此try {}会吸收符号,因此不会导致语法错误.


稍后更新

从现在开始, libextobjc用于@autoreleasepool"吸收符号".


Car*_*len 3

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

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

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

  • 我没有提到使用预处理器宏。重新阅读我的答案。 (2认同)