I think it's because `[NSURLSession sharedSession]` is the default session for the app, which is **always** created and initialized implicitly on application launch:

>The shared session uses the currently set global NSURLCache, NSHTTPCookieStorage, and NSURLCredentialStorage objects and is based on the default configuration.

Therefore any "global" Foundation networking methods, including `[NSURLProtocol registerClass:]`, will affect the shared session.

Also since it is impossible to configure `sharedSession` with an instance of `NSURLSessionConfiguration`, there would otherwise be no way to register URLProtocol handler classes, since you cannot modify the configuration after the session is created:

>Changing mutable values within the configuration object has no effect on the current session, but you can create a new session with the modified configuration object.