2017-10-13 37 views
1

我想管理內存,所以我想在退出ViewController時退出UIview。
而我嘗試使用關鍵字「弱」,我因爲我的聊天鍵盤爲零而崩潰。
我不知道爲什麼使它崩潰。
謝謝。
爲什麼我用uift初始化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)) 
} 
} 

我在設置斷點 「chatKeyboard = ChatKeyboard(:的CGRect(X:幀0,Y:0,寬度:300,高度:44))」,然後我的日誌打印:

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

回答

1

原因是你已經宣佈你chatKeyBoard作爲

weak var chatKeyboard:ChatKeyboard? 

這意味着你的viewController將不再持有強引用您加載視圖。因此,視圖的引用計數不會改變。

在您的viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 

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

實例化視圖,但因爲視圖是弱只要控制熄滅viewDidLoad中ARC的範圍舉行發佈視圖。

如果你希望你的看法是接近甚至在viewDidLoad中稱爲聲明強烈的一個refrence

var chatKeyboard:ChatKeyboard? 

希望它可以幫助

3

一個weak變量將盡快銷燬有沒有強引用它。

如果您創建視圖並將其直接分配給weak變量,它將立即銷燬。弱IBOutlets工作,因爲它們被添加到超級視圖(創建一個強大的參考)之前它們被分配給變量。您可以通過使用一個局部變量分配給您的屬性之前實現這一目標:

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

但是,在您的視圖控制器具有的觀點它關心,強引用無妨,只要這些意見不還有強烈的參考回到視圖控制器。當視圖控制器被銷燬時,它們將被銷燬。

0

在一個類或結構中,不要使用關鍵字「weak」來描述您將在同一個類或結構中初始化的屬性。