- As @Hellium noted in the comments, if nothing is referencing them then nothing can be using them. If your manager/utility holds references to all of them then you just need to load it. A common way to do so is to just use Resources.Load with a hard coded path to the utility's prefab/ScriptableObject.
- Unity destroys all scene objects when you load a scene. DontDestroyOnLoad stops it from destroying a particular object. ScriptableObjects are not scene objects so they are unaffected by either of those things.
I read on the documentation that you need to destroyimmediate these objects to prevent memory leaks. Do i need to add that to OnDisable or something similar to kill itself when done?
No, and Unity will actually complain if you try to do so. ScriptableObject.OnDisable is only ever called when it is being destroyed by the engine. It's not like a MonoBehaviour where you can enable and disable it at will.
I intend to use the same scriptableobjects again when the game is reopened, i just wasn't sure if it was entirely necessary to kill the objects every time the game is closed.
When you load the game again the utility/manager will load up the same references as the first time.
I'm unsure from the way you phrased it, but some people see the way it works in the editor (Unity undoes all changes to scene objects when you leave play mode, but ScriptableObjects are usually assets which are unaffected, so their data will persist) and they mistakenly think that it works the same in a build. It does not. When you build, the values of all your prefabs/ScriptableObjects/other assets are all fixed in. Each time you run that build you will start with the same values as when you built, regardless of any modifications you made last time you ran the game. You can't just use ScriptableObjects as an easy way to save stuff at runtime (it would be awesome if you could though).