6

cocos2d for iOS で 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

cocos2d for iOS で 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_ptrC++ で必要になることはめったにありません。

そして、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++ 型の受け渡し方法に注意してください。C++ 型は自分自身をコピーする方法を知っています。そのため、(たとえば) 値を返すと、実際には非常に複雑なコピーを実行できます。

于 2012-08-15T17:59:10.637 に答える