我正在通过翻译我为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类型的参数
我错过了什么?
答案 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]
不是指针,那么您可以使用2dBody
:NSData
,这会引入内存管理问题(除非您使用[NSData dataWithBytes:.. length:..]
变体),如果类的布局不是标准的,那么它会引入问题,并且无论如何都需要抛出它noCopy
。 我强烈建议使用STL集合,我个人使用这种方法