2012-08-14 59 views
6

我想知道在iOS的cocos2d中分配和释放box2d对象(b2World和b2Body)的最佳方式是什么?如何在cocos2d,iOS中正确地分配和释放box2d对象

分配

@property (nonatomic, assign) b2World * world; 
@property (nonatomic, assign) b2Body * body; 

解除分配

-(void)dealloc { 
     delete _world; 
     _world = nil; 
     _body = nil; 

有人可以解释为什么我不能使用保留和释放b2World和b2Body,为什么我们使用dealloc方法删除_world?为什么我们也不要删除body对象? (删除_body不工作)。将指针设置为nil时:我应该使用nil还是NULL?

回答

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++类型sre不引用计数意识。如果参考计数是您需要的,请参阅std::shared_ptr。在C++中很少需要std::shared_ptr,顺便说一句 - 如果你使用其中的几个,你很可能做错了什么。

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