Xcode,是否可以在不更新文件的情况下拦截和更改构建代码?如果是这样,怎么样?

时间:2013-09-28 16:01:22

标签: xcode build scripting compilation

我需要一种方法来拦截代码,然后再进入编译器,更改它,然后让它在文件/ Xcode中保持相同。

我认为构建脚本是一种流拦截,但似乎并非如此。另一种方法可能是在构建之前和之后运行脚本。我应该注意到这有什么影响吗?

-----编辑-----

为什么呢?我有一个基于某种注释语法的自动记录系统的想法。我希望能够在构建时解析某个字符串并将其替换为日志记录函数,但代码保持不变。有可能吗?

-----更新-----

似乎自定义编译器可能是前进的方式,或者至少是一个包装当前LLVM clang的插件。我一直在调查这个。以下是感兴趣的人的相关问题:Xcode custom compiler which wraps and does a passthru to clang

1 个答案:

答案 0 :(得分:2)

如果在实际编译代码之前使用“on build”,则意味着每次要运行脚本时都需要打开Xcode。我不相信有办法做到这一点。但是,您可以在运行代码之前使用Automator接收字符串,但是您需要使用Automator来构建应用程序,这是限制性的。另一种方法是在你的应用程序中创建两个类:一个预运行类和一个主类。预运行类将提示用户或读取文件(或类似的东西)来获取字符串,并根据字符串以特殊方式运行主类。

编辑:对评论的回复

我不知道如何在Objective-C中执行此操作,但您始终可以将主文件重命名为main.mm(.mm文件包含C ++和Objective-C代码)并向其添加C ++代码。但是,这是使用控制台:

using namespace std // all  (this line is optional)
string s = ""; //      this
cin >> s; //           is C++  (if you omitted the optional line above, the correct code is std::cin >> s;
MainClass mc = //constructor for your "main class" here in Objective-C
if(s == someCertainString){ //hypothetical string and C++ condition checking for a C++ string
    [mc doThisACertainWay:];
}else if(s == someOtherString){ // again, hypothetical string that you need to declare
    [mc doThisADifferentWay];
}

我现在不在PC上,因此无法检查代码,但您可以搜索如何在C ++和Obj-C中读取和写入文件。我现在唯一能给出的提示是,如果你使用C ++来读/写文件,那么你最初需要#include <iostream>

如果你不想使用控制台(如果你想发布它,这是正常的),你也可以进行对话。在此示例中,您不需要C ++,因此不要重命名主文件。创建一个新窗口(从现在开始称为theDialog),在开始时可见,并确保您的主图形界面不显示启动。将文本字段添加到theDialog并为其命名(在此示例中为tf)。添加标签以告知用户在文本字段中放置什么。添加一个按钮并将其链接到一个动作。在此操作中,输入以下代码:

MainClass mc = // constructor here
NSString *str = [self.tf stringValue];
if([str equalsString:someString]){ // hypothetical string and possible error in the condition checking, I'm new to Obj-C
    [mc doThisInACertainWay];
} else {
    [mc doThisInADifferentWay];
}