【问题标题】:Swift 3 TableViewController does not deinitSwift 3 TableViewController 不会取消初始化
【发布时间】:2017-06-01 18:32:10
【问题描述】:

我的 Swift 3 iOS 应用程序从 LoginViewController 开始,它连接到 TabBarController,它有 3 个 ChildView,每个都是 NavigationController,是 ViewController 的 rootView。

一个 ViewController 包含一个 Logout 按钮,它对 LoginViewController 执行 unwindSegue。

另一个(这个很关键)有 2 个容器视图,其中一个是 TableViewController。 TableViewController 使用来自后端的数据动态填充。

当后端给我 0 数据时,一切正常。您可以按下注销按钮和每个 ViewController,以及 ContainerViews 和 TableView 正确获取 deinit()。

一旦 TableViewController 从后端获取数据并显示单元格,它就不再为 TableViewController 调用 deinit()

原因可能是什么?我可以根据要求分享代码。

到目前为止我所做的尝试: 我试图在存在闭包的任何地方使用无主的自我。现在我不确定这部分我使用@escaping 获取数据的位置:

func loadMyMessages()
{
let myMessagesURL = "https://www.thewebsite.com/rest/messages/mine"
self.tableView.isHidden = true
if let url = URL(string: myMessagesURL) {
    self.updateFeedFilter(url, filter: self.activeFilter, hashTag: activeHashTags, completion: {  [unowned self] (feed) -> Void in
        self.feed?.items.removeAll()
        self.feed = feed
    })
}
}

func updateFeedFilter(_ url: URL, filter: String, hashTag: String, completion:   @escaping  (_ feed: Feed?) -> Void) {
let sid = self.prefs.string(forKey: "sid")
let headers2: HTTPHeaders = [
    "lastId": "0",
    "sid": sid!,
    "filter": filter,
    "hashTags": hashTag
]

Alamofire.request(url, method: .get, encoding: JSONEncoding.default, headers: headers2)
    .responseJSON { [unowned self] response in
        print(response)
        guard let responseError = response.result.error else {
            let feed = Feed(data: response.data!, sourceURL: url)
            OperationQueue.main.addOperation({ () -> Void in
                completion(feed)
                self.scrollToFirstRow()
                self.tableView.isHidden = false
                self.delegateClicked?.stopIndicator()
            })
            return
        }
        self.showNoInternetDialog()
        self.delegateClicked?.stopIndicator()
    }
}

感谢您的任何帮助!

【问题讨论】:

  • 一般情况下 - 你必须检查强引用循环的问题,它可能是由闭包或其他引用类型对象的releshenships引起的。
  • 这是我首先检查的。我让我所有的代表都成为弱变量,并且我所有的闭包都是无主的。我不确定代码示例中显示的转义闭包。会不会是问题?

标签: ios swift uitableview memory-management deinit


【解决方案1】:

好的,我想通了。我必须在一个闭包中使用 [unowned self],我在其中定义了由 ActiveLabel pod 提供的 hashTagTapped 操作。

对于闭包尝试使用 [unowned self],对于委托尝试使用弱 var。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2019-10-13
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多