如果我使用单例网络服务发出网络请求,是否需要使用 [弱自我]?



假设我有一个使用Alamofire的SessionManager的网络单例,如下所示:

进口阿拉莫火

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)
}
}

然后,我使用此服务类发出请求并重新加载表视图:

class MyViewController: UITableViewController {
@IBAction func fetchData(_: Any)  {
SomeService.shared.doSomePostRequest {
// do i need to use [weak self] here?
self.tableView.reloadData()
}
}
}

我还需要使用[弱自我]来避免崩溃和强参考周期吗?在任何时候,用户都可以通过按"返回"来关闭 MyViewController。

我假设我不需要它是否正确,因为服务类是单例?如果我在MyViewController中将其作为实例,我将不得不使用[弱自我]?

使用对对象的弱引用来确保在应该释放对象时释放它们。

单例永远不会被解除分配。因此,您是否有强、弱或不安全的指针并不重要。无需使引用变弱。

我不特别了解 Alamofire 的 SessionManager,但总的来说,是的,即使您使用单例,您也需要防止额外的保留。事实上,你必须防止它们,特别是因为它们是单例。

查看您的代码,您担心self是 MyViewController。如果在单一实例 SomeService 中创建对 MyViewController 的强引用,则永远不会发布 MyViewController,因为单例在应用程序的生存期内一直存在。它并不是一个真正的保留周期(它不是周期性的(,但效果是相同的 - MyViewController 和它保留的所有对象永远不会被释放。

最新更新