ios - 使用 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 错误?还是可以忽略它?
解决方案
推荐阅读
- java - 使用 sendKeys (Selenium, java) 键入非英语语言字符(西班牙语)
- sql - 列出每个类别中竞争最激烈的成员中得分最高的成员
- node.js - 将进程推送到后台会导致高 kswapd0
- c# - c# 中的接口/gererics 用法
- visual-studio-code - 在 vscode 中生成类注释
- python - 在 Python 3.6 AWS Lambda 函数中输出事件数据
- asp.net - 如何从查询字符串中获取外键并将其添加到数据库的新记录中?
- c# - 一次处理一组数字
- bash - Shell 脚本在电子邮件中出现乱码
- java - Java GUI BMI 计算器返回 Infinity 作为 BMI