我想知道在iOS的cocos2d中分配和释放box2d对象(b2World和b2Body)的最佳方法是什么?
分配
@property (nonatomic, assign) b2World * world;
@property (nonatomic, assign) b2Body * body;
解除分配
-(void)dealloc {
delete _world;
_world = nil;
_body = nil;
有人可以解释为什么我不能为b2World和b2Body使用retain和release,为什么我们在dealloc方法中使用delete _world?为什么我们不删除正文对象呢? (删除_body不起作用)。设置指向nil的指针时:我应该使用nil还是NULL?
答案 0 :(得分:2)
我想知道在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 ++类型不是引用计数感知的。如果您需要引用计数,请参阅std::shared_ptr
。在C ++中很少需要std::shared_ptr
,顺便说一下 - 如果你使用其中的几个,你可能会做错事。
为什么我们在dealloc方法中使用delete _world?
这就是C ++对象被破坏和释放的方式。特别是,使用new
创建的单个对象。和delete
并且您永远不必写delete
或delete[]
- 如果您遇到值不合适的特殊情况,请使用智能指针。
为什么我们也不删除正文对象?
你必须要求编写它的程序员 - 它要么是泄密,要么是其他地方引用/拥有的。
当设置指向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 ++类型 - 他们知道如何复制自己。所以返回一个值(例如)实际上可以执行非常复杂的复制。