如何在cocos2d,iOS中正确分配和释放box2d对象

时间:2012-08-14 09:24:21

标签: c++ objective-c ios memory-management box2d-iphone

我想知道在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?

1 个答案:

答案 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并且您永远不必写deletedelete[] - 如果您遇到值不合适的特殊情况,请使用智能指针。

  

为什么我们也不删除正文对象?

你必须要求编写它的程序员 - 它要么是泄密,要么是其他地方引用/拥有的。

  

当设置指向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 ++类型 - 他们知道如何复制自己。所以返回一个值(例如)实际上可以执行非常复杂的复制。