2017-10-13 17 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”来描述您将在同一个类或结构中初始化的属性。