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

6
我想知道在iOS的cocos2d中分配和释放box2d对象(b2World和b2Body)的最佳方法是什么?
分配:
@property (nonatomic, assign) b2World * world;
@property (nonatomic, assign) b2Body * body;

释放,撤销分配
-(void)dealloc {
      delete _world;
      _world = nil;
      _body = nil;

有人能解释一下为什么我不能使用retain和release来管理b2World和b2Body以及为什么我们在dealloc方法中使用delete _world而不删除body对象(delete _body无法正常工作)?当将指针设置为nil时,我应该使用nil还是NULL?
1个回答

2
我想知道在iOS的cocos2d中,使用现代化的C++语言,分配和释放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吗?

这些是C++类型,而不是obj-c类型。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,则析构函数将被调用。
当您需要比上面所见的值更复杂的东西时,请使用智能指针
最后,请注意如何传递和返回C++类型--它们知道如何复制自己。因此,返回一个值(例如)实际上可以执行非常复杂的复制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接