2017-01-17 7 views
0

My Swift 3 iOS App запускается с LoginViewController, который переходит в TabBarController, у которого есть 3 ChildViews, каждый из которых является NavigationController, являющимся корневым элементом ViewController.Swift 3 TableViewController не deinit

One ViewController содержит кнопку выхода из системы, которая выполняет функцию unwindSegue в LoginViewController.

Другой (этот критический) имеет 2 вида контейнеров, один из них - TableViewController. TableViewController заполняется динамически данными из бэкэнд.

Когда бэкэнд дает мне 0 данных, все работает нормально. Вы можете нажать кнопку «Выход», и каждый ViewController, так же как ContainerViews и TableView правильно выполняет deinit().

Как только TableViewController получает данные из бэкэнд и отображает ячейки, он больше не вызывает deinit() для TableViewController.

В чем может быть причина? Я могу использовать код по запросу.

что я пробовал до сих пор: Я попытался использовать незанятое я везде, где есть закрытие. Теперь я не уверен в этой части, где я получаю данные с @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() 
    } 
} 

Я благодарен за любую помощь!

+1

В целом - вам нужно проверить проблему сильного эталонного цикла, это может быть вызвано закрытием или повторным подключением других объектов ссылочного типа. – Dasem

+0

Это то, что я проверил первым. я сделал всех моих делегатов слабым вар, и все мои закрытые блоки не были. я не уверен в закрытии, которое показано в примере кода. Это может быть проблема? –

ответ

0

Хорошо, я понял. Я должен был использовать [unowned self] внутри закрытия, где я определил действие для hashTagTapped, которое предоставляется модулем ActiveLabel.

Для закрытий попробуйте использовать [unowned self], поскольку делегаты пытаются использовать слабый var.