The URLSession is not dynamically created every time we use it, it’s created once, when needed, and then we reuse the same session unless a new instance of this controller gets created.
Since that means we’re not losing the variable or reference to this session, then canceling or doing other operations on the session won’t result in leaks.
As for having different delegates. A single session can only have one delegate, so if you are looking at using URLSession with delegation and not completion-based calls, then only one object can be its delegate. You could create a global configuration and reuse it in different controllers that have their own URLSession, alternatively you could also create a manager or helper class that has a URLSession, a delegate (unless using completion-based data tasks), and then just performing new data tasks or network requests with it.
In my experience, completion-based calls are better than delegates for this last example. You can use your networking layer and simply handle things in your completion handlers wherever you make use of a network call.
Hope this helps