2012-08-14 11 views
6

mi chiedo qual è il modo migliore per allocare e rilasciare oggetti box2d (b2World e b2Body) in cocos2d per iOS?Come allocare correttamente e rilasciare oggetti box2d in cocos2d, iOS

Allocare

@property (nonatomic, assign) b2World * world; 
@property (nonatomic, assign) b2Body * body; 

Dealloca

-(void)dealloc { 
     delete _world; 
     _world = nil; 
     _body = nil; 

Qualcuno può spiegare perché non posso usare trattenere e rilasciare per b2World e b2Body e perché usiamo eliminare _World nel metodo dealloc? Perché non eliminiamo anche gli oggetti del corpo? (elimina _body non funziona). Quando si impostano i puntatori a zero: dovrei usare nil o NULL?

risposta

2

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.

Problemi correlati