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_ptr
。std::shared_ptr
C++ で必要になることはめったにありません。
そして、dealloc メソッドで delete _world を使用するのはなぜですか?
これが、C++ オブジェクトを破棄して解放する方法です。具体的には、 を使用して作成された単一のオブジェクトですnew
。またdelete
、書き込みdelete
やdelete[]
-- 値が不適切であるという異常なケースがある場合は、スマート ポインターを使用する必要はありません。
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++ 型の受け渡し方法に注意してください。C++ 型は自分自身をコピーする方法を知っています。そのため、(たとえば) 値を返すと、実際には非常に複雑なコピーを実行できます。