If you create a display object:
[lua]
button = display.newImageRect(…)
local function fred(event)
…
end
button:addEventListener(“touch”, fred)
group:insert(button)
[/lua]
in either createScene or enterScene and you add it to the scene’s view, i.e. group:insert… then when the scene is transitioned away, that button is no longer on screen so it can’t be interacted with. When the scene is purged or removed, those objects are destroyed. The event handler itself is just a function in code, it it doesn’t really get destroyed, but the objects isn’t there so there is no way to trigger the event. So yes, your a) assumption is right sort of. You don’t have to deal with it, but when the process that calls destroyScene() is running, your objects go away.
I’m not completely sure I follow what you mean by “Caching approach”, but if you mean that we keep the scene in memory in case you come back to it, when those objects transition back on screen, you can interact with them again and the existing event listeners you added when the object was first created are still there and functioning.