Xcode C++和Objective-C重构

8
有没有办法在Xcode中重构混合的C++/Objective-C代码?我正在使用Cocos2D和Box2D编写游戏,而Box2D是用C++编写的,因此我编写的每个类都应该有.mm扩展名。因此,当我尝试重命名变量时,会收到诸如“Xcode只能重构C和Objective-C代码”之类的消息。
提前感谢!

2
这里讲的是“重构”,而不是“折射仪”;) - CodeSmile
1
对于重构,我有时会使用AppCode,它的重构功能更强大。然而,它加载速度较慢,所以对我来说在Xcode中重命名仍然更实用。 - CodeSmile
4个回答

10

Xcode在重构方面非常有限,即使是普通的Obj-C也是如此。它基本上只能进行重命名,甚至不能在注释中重命名。如果它说它不能做某事,那么它可能就不能做。

唯一的重命名方法是使用查找和替换。请注意,Xcode可以处理正则表达式,因此通常已经足够好用了。

当然,问题在于查找和替换不知道编程语言,有时会添加额外的替换或忘记替换某些内容,因此要格外小心。每次重构后都需要进行干净的构建以检查是否正确地重命名了所有内容。

您也可以使用命令行工具(例如sed)来实现相同的功能。


谢谢!我只是想知道人们在处理大型项目时通常采用的方式。他们也使用查找和替换工具吗? - Terko
1
很难说。我猜每个人都有点不同。还要注意的是,XCode并不是市场上唯一的IDE。它是默认的,也是免费的,但不是唯一的。我听说JetBrains非常好,其中“可靠的重构”是其主要特点之一。我不知道它是否可以重构Obj-C++,但它可能比XCode更好的IDE。 - Sulthan
@Sulthan - 在许多方面,它是极其优秀的,但在其他方面则不然(请参见Stefen上面的评论)。我现在仅在(很少的)项目设置活动、(总是的)组织者活动和(从不的)编码、测试和集成方面使用xCode。如果他们能够解决性能问题并添加缺失的功能,那么xCode很快就会成为ExCode。 - YvesLeBorg
1
@Sulthan - 请注意,重构不仅仅是重命名事物。大多数情况下,我使用现代IDE的重构功能来提取方法、更改签名或在类/命名空间之间移动内容。 - Jay
@Jay,你很不幸,因为Xcode不是一款现代化的集成开发环境,它无法完成高级操作。 - Sulthan
1
使用AppCode进行重构已经稳定了1.5年(偶尔还会出现重构错误),所以现在我们使用它来进行重构。 - cacau

3

我在构建cocos2d/box2d游戏时遇到了同样的问题。

事实1:Xcode 4可以重构C和Objective-C(.m文件)代码,但无法重构Objective-C++代码(.mm文件)。

事实2:如果要与box2d(用c++编写)交互,则需要使用Objective-C++。

我通过以下步骤部分解决了这个问题:

  1. 我创建了一些Objective-C++包装器,用于与我需要进行交互的box2d类交互(例如,MyWorld.mm是c++类b2World的包装器,而MyBody.mm是c++类b2Body的包装器)。在这里,关键是避免在包装器的.h中引用box2d。
  2. 在我的项目的每个其他类中,我从未直接引用过box2d类,而是引用相关的包装器。当然,我还从这些类中删除了#import "Box2D.h"
  3. 我将我的项目中的所有其他类都转换为普通的Objective-C(.m)。

结果现在是,Xcode现在可以重构我的项目的每个类,除了包装器。

P.S. 当你需要在你的Objective-C类中使用一个包装器(例如MyWorld)时,你必须导入MyWorld.h而不是MyWorld.mm


2

您可能想在Github上查看这个项目 - 它仍在进行中,但仍然很有价值:

https://github.com/lukhnos/refactorial

它是一个基于Clang(即Xcode本身所基于的编译器)的c++重构工具。


这个项目现在看起来相当停滞不前。 :-/ - Ricardo Sanchez-Saez
好的 - AppCode 就是它了。 - cacau

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接