首页 > 解决方案 > 使用 UISearchController 会导致 objc_weak_error

问题描述

将 UISearchController 添加到 UITableViewController 后,如果在运行方案中激活了“Malloc Scribble”诊断选项,则每次应用程序进入后台(通过点击主页按钮)时都会记录以下 objc_weak_error。

objc[8426]: __weak variable at 0x... 持有 0x5555555555555555 而不是 0x.... 这可能是 objc_storeWeak() 和 objc_loadWeak() 的错误使用。打破 objc_weak_error 进行调试。

不幸的是,设置建议的断点并不能提供有用的信息。

我在一个更大的项目中遇到了这个问题,所以我尝试在一个非常简单的应用程序上重现它,该应用程序基于“单视图应用程序”模板(xcode 10.1),其中 UITableViewController 嵌入在导航控制器中,代码如下。执行搜索后,通过点击主页按钮进入后台总是会触发错误。我在 stackoverflow 和网络上都找不到有关此问题的任何有用信息。

import UIKit

class TableViewController: UITableViewController {
    let data = ["Berlin", "London", "New York", "Paris", "Tokyo"]
    var filteredData = [String]()
    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()
        searchController.searchResultsUpdater = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "Search Candies"
        navigationItem.searchController = searchController
        definesPresentationContext = true
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return isFiltering() ? filteredData.count : data.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = isFiltering() ? filteredData[indexPath.row] : data[indexPath.row]
        return cell
    }

    func searchBarIsEmpty() -> Bool {
        return searchController.searchBar.text?.isEmpty ?? true
    }

    func filterContentForSearchText(_ searchText: String, scope: String = "All") {
        filteredData = data.filter { $0.lowercased().contains(searchText.lowercased())}
        tableView.reloadData()
    }

    func isFiltering() -> Bool {
        return searchController.isActive && !searchBarIsEmpty()
    }
}

extension TableViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        filterContentForSearchText(searchController.searchBar.text!)
    }
}

错误是上面代码中错误使用 UISearchController 的结果,还是 iOS 错误?还是可以忽略它?

标签: iosswift

解决方案


推荐阅读