kna*_*ode 6 c++ memory-management objective-c box2d-iphone ios
我想知道在iOS的cocos2d中分配和释放box2d对象(b2World和b2Body)的最佳方法是什么?
分配
@property (nonatomic, assign) b2World * world;
@property (nonatomic, assign) b2Body * body;
Run Code Online (Sandbox Code Playgroud)
取消分配
-(void)dealloc {
delete _world;
_world = nil;
_body = nil;
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么我不能使用保留和释放b2World和b2Body,为什么我们在dealloc方法中使用delete _world?为什么我们不删除正文对象呢?(删除_body不起作用).设置指向nil的指针时:我应该使用nil还是NULL?
我想知道在 iOS 版 cocos2d 中分配和取消分配 box2d 对象(b2World 和 b2Body)的最佳方法是什么?
使用惯用的现代 C++。
@property (nonatomic, assign) b2World * world;
@property (nonatomic, assign) b2Body * body;
Run Code Online (Sandbox Code Playgroud)
不
(除非你自己正确地实现这些,这需要对语言有更多的理解)
-(void)dealloc {
delete _world;
_world = nil;
_body = nil;
Run Code Online (Sandbox Code Playgroud)
不
详细信息如下。
有人可以解释一下为什么我不能对 b2World 和 b2Body 使用保留和释放
这些是 C++ 类型,而不是 objc 类型。C++ 类型可以分配在许多区域中(例如,在堆栈、堆或用户定义的区域上)——C++ 类型不支持引用计数。如果您需要引用计数,请参阅std::shared_ptr。std::shared_ptr顺便说一句,在 C++ 中很少需要它——如果您使用其中的几个,您可能会做错什么。
为什么我们在 dealloc 方法中使用 delete _world ?
这就是 C++ 对象被销毁和释放的方式。具体来说,使用创建的单个对象new。如果您遇到值不合适的异常情况,delete您永远不必编写delete或-- 使用智能指针。delete[]
为什么我们不删除身体对象呢?
你必须询问编写它的程序员——它要么是泄漏,要么是在其他地方引用/拥有的。
将指针设置为 nil 时:应该使用 nil 还是 NULL?
0
无论如何,为了进入你的主题:
如果对象具有默认构造函数,通常会使用它:
@interface MONObject : NSObject {
@private
b2World world;
b2Body body;
}
@end
Run Code Online (Sandbox Code Playgroud)
如果您可以将它们放入您的@implementation区块中,请这样做。
并且您的对象将在之前默认构造-init(除非您设置GCC_OBJC_CALL_CXX_CDTORS为NO,这是一个非常糟糕的主意)。
你的 dealloc 看起来像这样:
- (void)dealloc {
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您就不会实施dealloc. 将调用析构函数(前提GCC_OBJC_CALL_CXX_CDTORS是已启用)。
当您想要比值更复杂的东西(如上所示)时,请使用智能指针。
最后,要小心如何传递和返回 C++ 类型——它们知道如何复制自身。因此返回一个值(例如)实际上可以执行非常复杂的复制。
| 归档时间: |
|
| 查看次数: |
1338 次 |
| 最近记录: |