[英]Do I need to use [weak self] if I'm making a network request using a singleton networking service?
假設我有一個使用Alamofire的SessionManager的網絡單例,如下所示:
進口Alamofire
class Network {
static let shared = Network()
private init() {}
private var sessionManager: SessionManager = {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
return SessionManager(configuration: configuration)
}
func postRequest(params: [String: Any]? = nil, completion: (() -> ())? = nil) {
sessionManager.request(url, method: .post, parameters: params).validate().responseData {
// do something with response
completion()
}
}
}
然后我在服務類中使用它:
class SomeService {
static let shared = SomeService()
private init() {}
func doSomePostRequest(params: [String: Any]? = nil, completion: (() -> ())? = nil) {
Network.shared.postRequest(params: params, completion: completion)
}
}
然后我發出請求並使用此服務類重新加載tableview:
class MyViewController: UITableViewController {
@IBAction func fetchData(_: Any) {
SomeService.shared.doSomePostRequest {
// do i need to use [weak self] here?
self.tableView.reloadData()
}
}
}
我還需要使用[弱自我]來避免崩潰和強大的參考周期嗎? 在任何時候,用戶都可以通過按Back來關閉MyViewController。
假設我不需要它,我是否正確,因為服務類是單身? 如果我在MyViewController中創建一個實例,我必須使用[弱自我]?
您使用對對象的弱引用來確保它們應該被釋放。
單身人士永遠不會被解除分配。 因此,無論你有強,弱或不安全的指針都沒關系。 無需使參考弱。
我不是特別了解Alamofire的SessionManager,但總的來說,是的,你需要防止額外的保留,即使你使用的是單身人士。 事實上,你必須要防止他們, 特別是因為他們是單身人士。
看你的代碼中, self
你擔心是MyViewController。 如果您在單件SomeService中創建對MyViewController的強引用,那么MyViewController將永遠不會被釋放,因為您的單例存在於應用程序的生命周期中。 它並不是每個說明的保留周期(它不是周期性的),但效果是相同的 - MyViewController及其保留的所有對象永遠不會被釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.