Actually, EnvironmentObjects will only exist for the lifetime of the app if they’re injected at the root of the application view hierarchy.
Inject one, say, as a way for a master list to communicate with a detail list, and it’s in memory only for as long as that master list and/or detail list is in the view hierarchy. Return further up the tree and it disappears.
They have other issues, but they’re better than using singletons. After all, there are many, many, many articles written on why we should not use singletons in a app.
And finally, it may depend on your application’s structure, of course, but I wouldn’t dismiss them simply because of their memory footprint. Most application data structures are a couple of dozen bytes at most. An array of 100 of them might be 2–3K bytes or so.
Use just one good size, high resolution PNG in your app and you’ve probably blown past that mark by 4,000–5,000%.