是否可以在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文档...
感谢您的答复!
你的想法是正确的:在你的代码中这是不可能的。增加更多@
-directives的唯一方法是通过编译器本身。即使你遇到了这些麻烦,我几乎可以保证突出显示对它们的支持的语法被硬编码到某处的Xcode配置文件中。
哦,如果您正在考虑使用预处理器宏,我的理解是@
字符在预处理器宏中是非法的。
编辑:我跑了一个测试,我是正确的。在C预处理器宏中使用@
字符是非法的。他们遵循与变量名称相同的规则。
你的意思是在Objective-C的范围内吗?不,因为它无法识别您的新关键字。您可以编写一个预处理程序来检测@whatever
并将其转换为代码,但是如果您告诉我们具体要做什么,我们可能会提出更有效或最佳的方法。
@字符在C预处理器宏中是非法的。 – 2011-02-12 00:44:34
感谢您的回应。你给了我如何做到这一点的想法。忘了你不需要语言钩子来生成代码。 – Tobias 2011-02-12 01:38:31
@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
为 “沉浸在符号”。
我没有说这会很容易。然而,像`$ coredata`这样的东西是一个有效的C预处理器标记(`$`可以在符号/宏名称中使用),所以它可以在#define语句中使用。不过,如果你告诉我们你的目标,我们可能会提出一个更容易或更好的解决问题的方法。 – 2011-02-12 19:27:50