Objective-C容器的容器

时间:2013-05-22 14:06:53

标签: objective-c nsmutablearray

我正在通过翻译我为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类型的参数

我错过了什么?

1 个答案:

答案 0 :(得分:5)

首先,您永远不需要转换为id类型,因为您可以将id视为Java中的Object类:它是一个隐式的向上转换,不需要明确。

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

您主要有三种解决方案:

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

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