[swift5] URLSession: Fix memory leak of SessionDelegate (#8558)

* Remove unused stored reference of delegate. URLSession keeps a strong reference anyway.

* Fix cleanup

* Update samples
This commit is contained in:
Frank Lehmann 2021-01-29 03:52:39 +01:00 committed by GitHub
parent 2553d056dc
commit 64f5dc8077
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 44 additions and 33 deletions

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
internal class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ internal class URLSessionRequestBuilder<T>: RequestBuilder<T> {
internal func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ internal class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ internal class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/**
May be assigned if you want to control the authentication challenges.
*/
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
}
let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil
}
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}
} else {
apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
}
}
}