1

我正在通过翻译我为 Android 游戏编写的一些 Java 代码,在 Objective-c 中迈出第一步(在很久很久之后)。似乎没有容器可以容纳一个对象,而无需id先将其投射到?或者有吗?

具体来说,这是我正在尝试使用的代码:

NSMutableArray *touchedBodies = [[NSMutableArray alloc] init];
// some additional code
if(![touchedBodies containsObject:(id)body]) {
    [touchedBodies addObject:(id)body];
}

containsObject行通过正常,但在touchedBodies addObject:(id)b我收到“错误访问”错误。我要添加的主体是合法的 Box2D b2Body

当我尝试直接添加主体而不进行投射时:

[touchedBodies addObject:body];

编译器抱怨“无法使用 b2Body* 类型的左值初始化 id 类型的参数”

我错过了什么?

4

1 回答 1

5

首先,您永远不需要id仅仅因为您可以将其视为Javaid中的Object类而强制转换为类型:它是一种不需要显式的隐式向上转换。

在第二种情况下,出现问题是因为2dBody是 C++ 类,而不是 Objective-C 类。虽然您可以混合使用 Objective-C++ 和 C++ 代码(前者是后者的超集),但如果没有一些变通方法,则不能混合使用这两种语言的对象。

您主要有三个解决方案:

  • if2dBody是指针,将其包装在NSValue:[touchedBodies addObject:[NSValue valueWithPointer:body]]中,这会引入对象分配的一些开销,并且在使用它时需要强制转换它,2dBody *b = (2dBody*)[value pointerValue]
  • 如果2dBody不是指针,那么您可以使用NSData: [NSData dataWithBytes:.. length:..],这会引入开销,内存管理问题(除非您使用noCopy变体),如果类的布局不标准,则会引入问题,并且无论如何您都需要强制转换它
  • 忘记可可集合并使用 STL 集合,它们的性能更高,并且可以无缝地管理所有内容:vector<2dBody> touchedBodies; touchedBodies.push_back(body);.

我强烈建议使用 STL 集合,我个人使用这种方法

于 2013-05-22T14:16:32.880 回答