これは私の質問の再投稿ですが、あまりにも多くの編集のために私は例を簡略化していますので、質問を何度も再編集するのではなく、 。UISwitchが割り当て解除されていない
問題:
UISwitch
オブジェクトは何とか何がそれで行われていない場合でも、割り当てを解除しません。
プロジェクト:
2つだけのビューコントローラがあります。 VC1およびVC2。 VC1にはVC2を表示するボタンが1つあります。 VC2には、それ自身を却下するボタンと、カスタムのプロパティであるUISwitch
とUILabel
とUIStepper
が含まれています。
VC1:
class VC1: UIViewController {
let button = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(button)
button.addTarget(self, action: #selector(open), for: .touchUpInside)
// Some auto layout (not relevant to the question)
}
func open() { present(VC2(), animated: true) }
}
VC2:
class VC2: UIViewController {
let button = UIButton()
let shifty = CustomSwitch() // Note: nothing has been done with this
let labels = CustomLabels()
let steppy = CustomSteppy()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(button)
button.addTarget(self, action: #selector(close), for: .touchUpInside)
// Some auto layout (not relevant to the question)
}
func close() { dismiss(animated: true) }
}
サブクラス:
class CustomSwitch: UISwitch { deinit { print("Switch has been deinitialized") } }
class CustomLabels: UILabel { deinit { print("Labels has been deinitialized") } }
class CustomSteppy: UIStepper { deinit { print("Steppy has been deinitialized") } }
私はこれらのサブクラスを作成した唯一の理由は、Sでありますoプロファイラで簡単に追跡することができました。 UISwitch
をサブクラス化しなくても同じことが起こります。
EDIT:
私はサブクラスにdeinit
を追加しUILabel
などUIStepper
は、メッセージを表示している両方ました:
Labels has been deinitialized
Steppy has been deinitialized
だから、UISwitch
が取得されていないようです初期化されていない。
スクリーンショット:
このスクリーンショットでは、私が開かれ、VC2を複数回閉じました。そこには、オブジェクトCustomSwitch
だけが永続的な状態を保っているのが見えますが、CustomLabels
とCustomSteppy
は、そうでなければならないように割り当てられています。
Rmaddyによって提案されたとも私は新しい質問を作成したい理由は、参照カウントの結果であるとして。私はSOに関するいくつかの説明に従ってきましたが、私は完全にそれをどうするのかについてはあまりよく分かりません。
QUESTION:
なぜこのUISwitchはこのように動作していると私はこれをどのように修正することができますか?
あなたは以前の質問で提案したことをしましたか?覚えていることは、Instrumentsの「Reference Reference Count」チェックボックスをチェックして、アプリを再度プロファイルすることでした。それから各スイッチへの参照を維持していたものを見てください。 – rmaddy
@rmaddy申し訳ありません、私はそれをやったし、それらのスクリーンショットを追加することを忘れました。私は本当に今混乱しているので、私はそれを作ることが何であるか分からない。それを修正しようと努力しているがまだ運がまだありません。 –
これは、カウントが+0であることを示しています。つまり、割り当てが解除されているはずです。実際のデバイスやシミュレータでテストしていますか?私はこれらの種類のシミュレータを信頼しません。 – rmaddy