how to remove a whole scene when exiting a scene?

You are not too far off.  There are rarely things you have to do in destroyScene.  But most of the time people are not adding touch handlers to the Runtime object, but to the display objects.  Think of createScene as the place to create anything that shows (other than native.* objects).  If you are adding touch handlers and such directly to the object, you do that in createScene as well.

You can load audio there, but if you do, you have to dispose of it in destroyScene.  createScene and destroyScene are kind of pairs. They go together.  Now Corona SDK will clean up your display objects for you, and if you were adding those touch handlers to display objects they would be cleaned up too.  This is why there isn’t much to do in destroyScene

Normally I would start Runtime listeners in enterScene and remove them in it’s mate, exitScene as they always execute in pairs.

where would I put the onCollision function?

Typically you’d put that up above the scene:createScene() function – you can stick all the functions for that scene up there. I’ve found the fewer lines of code inside createScene() and enterScene() the better (because then you can more easily reuse those functions and maintenance in general is easier that way).

 Jay

ahhh ok this is all making a lot more sense now. Where would I remove event listeners? btw thanks a ton!

As Jay said, the function probably should be outside of any of the scene event functions, but the code to turn the collision handler (event listener) on can be done in enterScene.  You really don’t want physics starting to do things until after the scene is on the screen.  Then you would remove it in exitScene.

is there a way I can completely remove  a function?

You do not need to worry about removing functions.  They don’t take up much memory and don’t need freed up.  When a scene is completely removed, all of the code of that module is also removed as well.