我想知道在iOS的cocos2d中分配和释放box2d对象(b2World和b2Body)的最佳方式是什么?
使用惯用的现代C++。
@property (nonatomic, assign) b2World * world;
@property (nonatomic, assign) b2Body * body;
没有
(除非你正确地执行这些自己,这需要的语言更理解)
-(void)dealloc {
delete _world;
_world = nil;
_body = nil;
没有
详情如下。
有人可以解释为什么我不能使用保留和释放b2World和b2Body
这些都是C++的类型,不objc类型。 C++类型可能分配在许多地区(例如堆栈,堆或用户定义的区域) - C++类型sre不引用计数意识。如果参考计数是您需要的,请参阅std::shared_ptr
。在C++中很少需要std::shared_ptr
,顺便说一句 - 如果你使用其中的几个,你很可能做错了什么。
为什么我们在dealloc方法中使用delete _world?
这就是C++对象被破坏和释放的方式。特别是使用new
创建的单个对象。和delete
,你不应该写delete
或delete[]
- 如果你有不寻常的情况下价值是不适合的使用智能指针。
为什么我们不要删除body对象呢?
您将不得不问问编写它的程序员 - 它可能是泄漏或引用/其他地方拥有。
将指针设置为nil时:我应该使用nil还是NULL?
0
不管怎么说,让你的主题:
您一般会使用这个如果对象有默认的构造函数:
@interface MONObject : NSObject {
@private
b2World world;
b2Body body;
}
@end
,如果你可以把这些在你的@implementation
区块,请这样做。
并且您的对象将在-init
之前默认构建(除非您将GCC_OBJC_CALL_CXX_CDTORS
设置为NO
,这是一个非常糟糕的主意)。
和你的dealloc应该是这样的:
- (void)dealloc {
[super dealloc];
}
在这种情况下
,你只是没有实现dealloc
。将会调用析构函数(提供GCC_OBJC_CALL_CXX_CDTORS
已启用)。
当你想要比某个值更复杂的东西时(见上面),请使用smart pointer。
最后,要小心你如何传递和返回C++类型 - 他们知道如何复制自己。所以返回一个值(例如)实际上可以执行非常复杂的复制。