2017-10-13 1 views
1

私はViewControllerを離れるときにUIviewを除外したいので、私はメモリを管理したいです。
キーワード「弱い」を使用しようとしましたが、私のチャットボードがゼロであるためクラッシュします。
なぜクラッシュするのかわかりません。
ありがとうございます。
私はなぜuiviewとuiviewを初期化するのも素早く行うのですか?

class ChatKeyboard: UIView { 

var buttonMic:UIButton = {()->UIButton in 
    let ui:UIButton = GeneratorButton() 
    return ui 
}() 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    print("===) ChatKeyboard init.") 
    translatesAutoresizingMaskIntoConstraints = false 
    loadContent() 
    loadConstrain() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

deinit { 
    print("===) ChatKeyboard deinit.") 
} 

func loadContent() { 

backgroundColor = UIColor.white 
addSubview(buttonMic) 
} 

func loadConstrain() { 

buttonMic.snp.makeConstraints { (make) -> Void in 
      make.left.equalTo(micLeftPadding) 
      make.top.equalTo(micTopPadding) 
      make.width.equalTo(UIScreen.main.bounds.width*0.0581) 
      make.height.equalTo(UIScreen.main.bounds.height*0.045) 
} 
} 
} 


class ChatroomViewController: UIViewController{ 

weak var chatKeyboard:ChatKeyboard? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    chatKeyboard = ChatKeyboard(frame: CGRect(x: 0, y: 0, width: 300, height: 44)) 
} 
} 

I "はchatKeyboard = ChatKeyboard(フレーム:CGRect(X:0、Y:0、幅:300、高さ:44))" にブレークポイントを設定した後、私のログ記録:

===) ChatKeyboard init. 
===) ChatKeyboard deinit. 

答えて

1

理由は、あなたが

あなたのViewControllerはあなたがロードビューへの強い参照を保持しないことを意味します
weak var chatKeyboard:ChatKeyboard? 

としてごchatKeyBoardを宣言しています。したがって、ビューの参照カウントは変化しません。あなたのviewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 

    chatKeyboard = ChatKeyboard(frame: CGRect(x: 0, y: 0, width: 300, height: 44)) 
} 

あなたは、ビューをインスタンス化しますが、ビューが弱いとすぐに制御がのviewDidLoad ARCの範囲外になると開催されましたので、ビューをリリースしました。

あなたはあなたのビューでのviewDidLoadが

var chatKeyboard:ChatKeyboard? 

はそれが

3

weak変数は、すぐに強い参照がないとして破棄されますホープ強いrefrenceを宣言呼ばた後もアクセスできるようにしたい場合それ。

ビューを作成してweak変数に直接割り当てると、そのビューはすぐに破棄されます。弱いIBOutletは、の前にのスーパービューに追加され(強い参照を作成するため)、変数に割り当てられます。あなたの財産に割り当てる前に、ローカル変数を使用することによって、これを達成することができます。しかし

let keyboard = ChatKeyboard(...) 
view.addSubview(keyboard) 
chatKeyboard = keyboard 

、それは、気ビューへの強い参照を持つビューコントローラには害がない限り、これらのビューがないこともそうであるようにView Controllerに強い参照を戻します。 View Controllerが破棄されると、それらは破棄されます。

0

クラスまたは構造体では、同じクラスまたは構造体で初期化するプロパティを記述するキーワード "weak"を使用しないでください。

関連する問題