3

問題の解決策はすでに知っていますが、ここで何が起こっているのか本当にわかりません。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からダウンロードできます。

迅速なコンパイラがそこで何をしているのか知りたいです!

::編集::

クラッシュdoSomethingWith:は拡張機能に依存していることにも注意してください!

4

1 に答える 1

0

基本的に、再利用可能なセルを「所有」することはありません。UITableView所有しています。強い参照を持つ関数に同じセルを 3 回渡しているので (あなたが書いた、解決策を知っているので省略します)、セルの ref カウントを増やします (この場合は +3、しかし、それは問題ではありません)。ある時点で はUITableViewそのセルを解放することを決定しますが、あなたUIViewControllerはそれらに強い参照を持っています。この時点でアプリがクラッシュします。ここにバグはありません。所有していないオブジェクトを渡してはいけません。

于 2016-09-21T15:26:04.650 に答える