【问题标题】:How to properly allocate and deallocate box2d objects in cocos2d, iOS如何在 cocos2d、iOS 中正确分配和解除分配 box2d 对象
【发布时间】:2012-08-10 13:43:40
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我想知道在 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_ptrstd::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_CDTORS 设置为NO,这是一个非常糟糕的主意)。

    你的 dealloc 看起来像这样:

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

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

    如果您想要比值更复杂的东西(见上文),请使用smart pointer

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多