6

我想知道在 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 使用保留和释放以及为什么我们在 dealloc 方法中使用 delete _world 吗?为什么我们也不删除 body 对象?(删除 _body 不起作用)。设置指向 nil 的指针时:我应该使用 nil 还是 NULL?

4

1 回答 1

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. std::shared_ptr在 C++ 中很少需要,顺便说一句——如果你使用其中的几个,你可能做错了什么。

为什么我们在 dealloc 方法中使用 delete _world?

这就是 C++ 对象被销毁和释放的方式。具体来说,使用new. 如果您遇到值不合适的异常情况,您永远不必编写或使用智能delete指针deletedelete[]

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

您将不得不询问编写它的程序员-它要么是泄漏,要么是在其他地方引用/拥有。

设置指向 nil 的指针时:我应该使用 nil 还是 NULL?

0


无论如何,要进入您的主题:

如果对象具有默认构造函数,您通常会使用它:

@interface MONObject : NSObject {
@private
  b2World world;
  b2Body body;
}
@end

如果您可以将它们放在您的@implementation街区中,请这样做。

并且您的对象将在之前默认构造-init(除非您设置GCC_OBJC_CALL_CXX_CDTORSNO,这是一个非常糟糕的主意)。

你的 dealloc 看起来像这样:

- (void)dealloc {
  [super dealloc];
}

在这种情况下,您不会实施dealloc. 将调用析构函数(前提GCC_OBJC_CALL_CXX_CDTORS是已启用)。

当您想要比值更复杂的东西时(见上文),请使用智能指针

最后,小心你如何传递和返回 C++ 类型——它们知道如何复制自己。所以返回一个值(例如)实际上可以执行非常复杂的复制。

于 2012-08-15T17:59:10.637 回答