Mi chiedo quale sia il modo migliore per allocare e deallocare oggetti box2d (b2World e b2Body) in cocos2d per iOS?
utilizzando C++ idiomatico e moderno.
@property (nonatomic, assign) b2World * world;
@property (nonatomic, assign) b2Body * body;
No
(a meno che non si sceglie di implementare questi stessi correttamente, il che richiede molto più comprensione della lingua)
-(void)dealloc {
delete _world;
_world = nil;
_body = nil;
No
dettagli di seguito.
Qualcuno può spiegare perché non posso usare trattenere e rilasciare per b2World e b2Body
questi sono i tipi C++, non tipi objc. I tipi C++ possono essere allocati in molte regioni (ad esempio nello stack, heap o aree definite dall'utente) - I tipi C++ non sono consapevoli del conteggio dei riferimenti. se il conteggio dei riferimenti è quello che ti serve, vedi std::shared_ptr
. std::shared_ptr
è raramente mai necessario in C++, btw - se si utilizzano molti di questi, è probabile che si stia facendo qualcosa di sbagliato.
e perché utilizziamo delete _world nel metodo dealloc?
è così che gli oggetti C++ vengono distrutti e liberati. in particolare, singoli oggetti che sono stati creati utilizzando new
. e delete
e non dovresti mai scrivere delete
o delete[]
- usa i puntatori intelligenti se hai il caso insolito in cui il valore non è adatto.
Perché non eliminiamo anche gli oggetti del corpo?
si dovrebbe chiedere al programmatore che lo ha scritto - è una perdita, o di riferimento/di proprietà altrove.
Quando si impostano i puntatori su zero: dovrei usare nil o NULL?
0
In ogni modo, per arrivare al soggetto:
si farebbe in genere utilizzare questo se gli oggetti hanno costruttori di default:
@interface MONObject : NSObject {
@private
b2World world;
b2Body body;
}
@end
se è possibile inserire quelle nel tuo blocco @implementation
, fallo.
e il tuo oggetto dovrebbe essere predefinito prima di -init
(a meno che non si imposta GCC_OBJC_CALL_CXX_CDTORS
su NO
, che è una pessima idea).
e la tua dealloc sarebbe simile a questa:
- (void)dealloc {
[super dealloc];
}
in questo caso, si sarebbe solo non implementare dealloc
. i distruttori saranno chiamati (purché GCC_OBJC_CALL_CXX_CDTORS
sia abilitato).
quando si desidera qualcosa di più complesso di un valore (visto sopra), utilizzare un smart pointer.
Infine, fai attenzione a come passi e restituisci tipi C++: sanno come copiarsi. quindi restituire un valore (ad esempio) può effettivamente eseguire una copia molto complessa.