2010-07-26 2 views

risposta

10

CCCallFuncN passa il CCNode che hai chiamato l'azione al metodo. Per esempio, se è necessario eseguire un'azione che rimuove il nodo dal suo genitore è possibile utilizzare CCCallFuncN e poi detto metodo sarebbe simile a questa:

-(void)theCalledMethod:(CCNode *)thePassedNode 
{ 
    [thePassedNode.parent removeChild:thePassedNode]; 
} 

Se è stato utilizzato un CCCallFunc invece si dovrebbe tenere un riferimento alla detto nodo per poterlo recuperare in seguito e rimuoverlo nel metodo chiamato.

+1

La differenza di comportamento tra questi due metodi è * estremamente * importante da ricordare. Recentemente, ho avuto un EXC_BAD_ACCESS in un callback che mi stava facendo impazzire; Gli strumenti non sono riusciti a trovare nessuno Zombi e le poche conserve che mi erano sembrate corrette. Ho scoperto che stavo invocando il mio callback con CCCallFunc() invece di CCCallFuncN(). Poiché CCCallFunc() non passa il CCNode direttamente alla richiamata, i tentativi di callback di operare sul mittente hanno causato il blocco della mia app. È incredibile come una "N" possa essere la differenza tra un'app che si schianta e una perfettamente funzionante. – Blackcoat