gpt4 book ai didi

ios - 当我将 UITableViewCell 作为 AnyObject 传递时,我的应用程序崩溃了吗?到另一个功能

转载 作者:可可西里 更新时间:2023-10-31 23:14:30 24 4
gpt4 key购买 nike

我已经知道我的问题的解决方案,但我真的不明白这里发生了什么。我有一个 UITableViewController 获取 didSelectRow 中的单元格并将其用于其他功能中的某些内容。我将单元格作为 AnyObject? 传递。现在,当我深入了解详细 VC,然后再次返回,再重复这些步骤 2 次时,我的应用程序崩溃了。

起初我认为这是我应用程序中其他地方的问题,但后来我创建了一个示例项目,除了那几行什么都没有,并设法重现了这个错误。我也已经提交了一个雷达,但我不想死掉(因为你永远不会收到那些雷达人员的回音);)任何人都可以向我解释这里发生了什么!

final class MasterViewController: UITableViewController {

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

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let cell = tableView.cellForRow(at: indexPath)
doSomethingWith(sender: cell)
}

}

extension MasterViewController {
func doSomethingWith(sender: AnyObject?) {
// I don't even use that sender!!!
// If the function would read doSomethingWith(sender: Any?) everything would be ok!
}
}

如果您愿意,可以在以下位置下载整个示例:http://www.georgbachmann.com/demo/CrashTest.zip

我真的很想知道 swift 编译器在那里做了什么!

::编辑::

我刚刚注意到崩溃还取决于 doSomethingWith: 在扩展中!

最佳答案

基本上,您并不“拥有”可重用单元。 UITableView 拥有它们。由于您将同一个单元格三次传递给具有强引用的函数(您写过,您知道解决方案,所以我省略了它),因此您增加了单元格的引用计数(在本例中为 +3,但没关系)。在某些时候 UITableView 决定释放它的单元格,但是您的 UIViewController 对它们有很强的引用。此时应用程序崩溃。这里没有错误 - 你永远不应该传递你不拥有的对象。

关于ios - 当我将 UITableViewCell 作为 AnyObject 传递时,我的应用程序崩溃了吗?到另一个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39620130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com