Me pregunto cuál es la mejor manera de asignar y desasignar objetos box2d (b2World y b2Body) en cocos2d para iOS?
usando idiomático, moderno C++.
@property (nonatomic, assign) b2World * world;
@property (nonatomic, assign) b2Body * body;
Sin
(a menos que se apliquen dichas mismo correctamente, lo que requiere mucho más la comprensión de la lengua)
-(void)dealloc {
delete _world;
_world = nil;
_body = nil;
Sin
detalles a continuación.
Puede alguien explicar por qué no puedo usar retener y liberar para b2World y b2Body
estos son los tipos de C++, no tipos ObjC. Los tipos de C++ se pueden asignar en muchas regiones (por ejemplo, en la pila, el montón o las áreas definidas por el usuario): los tipos de C++ no son conscientes del conteo de referencias. si el conteo de referencias es lo que necesita, consulte std::shared_ptr
. std::shared_ptr
rara vez se necesita en C++, por cierto, si utiliza varios de estos, es probable que esté haciendo algo mal.
y por qué usamos el método delete _world in dealloc?
Así es como se destruyen y liberan los objetos C++. específicamente, objetos individuales que se crearon usando new
. y delete
y nunca debería tener que escribir delete
o delete[]
- use punteros inteligentes si tiene el caso inusual donde el valor no es adecuado.
¿Por qué no eliminamos los objetos del cuerpo también?
tendrías que preguntarle al programador que lo escribió, ya sea una fuga, o se hace referencia/propiedad en otro lugar.
Al configurar los punteros a nil: ¿Debería usar nil o NULL?
0
De todas formas, para llegar a su objetivo:
que usaría generalmente esto si los objetos tienen constructores por defecto:
@interface MONObject : NSObject {
@private
b2World world;
b2Body body;
}
@end
si se puede colocar los en su bloque @implementation
, hágalo.
y su objeto se construiría por defecto antes de -init
(a menos que configure GCC_OBJC_CALL_CXX_CDTORS
en , lo cual es una muy mala idea).
y su dealloc se vería así:
- (void)dealloc {
[super dealloc];
}
en este caso, usted acaba de no aplicar dealloc
. se llamarán los destructores (siempre que esté habilitado GCC_OBJC_CALL_CXX_CDTORS
).
cuando desee algo más complejo que un valor (visto arriba), utilice un smart pointer.
Finalmente, tenga cuidado de cómo pasa y devuelve los tipos de C++: ellos saben cómo copiarse. por lo tanto, devolver un valor (por ejemplo) puede realmente realizar una copia muy compleja.