我通常设置UIImageView和UITextField等,如下所示。但是,下面的示例中出现了内存泄漏,我不知道原因。
如果我使用与一起设置的标准,则为
var buttonImageView: UIImageView!并在init方法中设置buttonImageView泄漏消失。
或
使用下面的示例,如果我使它成为lazy,泄漏也会消失。
示例
class BasicButton: UIControl {
// Cause of leak
var buttonImageView: UIImageView = {
let logoView = UIImageView()
logoView.contentMode = .scaleAspectFill
logoView.tintColor = UIColor.blue
logoView.translatesAutoresizingMaskIntoConstraints = false
logoView.isUserInteractionEnabled = false
return logoView
}()
init(image: UIImage) {
self.init()
buttonImageView.image = image
setupView()
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
private func setupView() {
addSubview(buttonImageView)
setupLayout()
}
private func setupLayout() {
translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
buttonImageView.centerXAnchor.constraint(equalTo: centerXAnchor),
buttonImageView.centerYAnchor.constraint(equalTo: centerYAnchor),
buttonImageView.heightAnchor.constraint(equalToConstant: 80),
buttonImageView.widthAnchor.constraint(equalToConstant: 80)
])
}
}发布于 2019-01-20 00:30:39
原来我没有给super打电话。插入UIControl的正确方法如下:
init(image: UIImage) {
// Fixes Leak
super.init(frame:CGRect(x: 0, y: 0, width: 100, height: 100))
// Wrong init was called causing leak
// self.init()
buttonImageView.image = image
setupView()
}但是,代码仍然会编译和运行,但会导致进程中的泄漏。如果有人能详细说明为什么会发生这种情况,我们将不胜感激。
https://stackoverflow.com/questions/54272073
复制相似问题