运行此代码时,我崩溃了。我确切地知道为什么,但是我不知道如何使它不崩溃。
代码:
// Is Global
weak var modelImage: UIImageView!
// this gets called in a function
modelImage = UIImageView()
modelImage.frame = CGRect(origin: CGPoint(x: modelSectionInfoCase.frame.width * 0.2, y: modelSectionInfoCase.frame.height * 0.1), size: CGSize(width: modelSectionInfoCase.frame.width / 5, height: modelSectionInfoCase.frame.height / 1.25))
modelImage.alpha = 1.0
modelImage.clipsToBounds = false
modelImage.isUserInteractionEnabled = true
modelImage.backgroundColor = UIColor.clear
modelImage.layer.setAffineTransform(CGAffineTransform(scaleX: -1, y: 1))
modelSectionInfoCase.insertSubview(modelImage, at: 0)
modelSectionInfoCase.bringSubview(toFront: modelImage)
更新:
我需要保留“弱变量”,因为我遇到了内存问题。我正在尝试使用“弱变量”修复内存泄漏。不仅在此变量上,而且在具有相同逻辑的其他变量上。
答案 0 :(得分:4)
就如警告所述,删除weak
var modelImage: UIImageView!
当您将imageView属性声明为weak
时,它将不保存分配给它的任何引用,因此它将保持其值为nil导致崩溃,因此将其保留为默认的强值
答案 1 :(得分:2)
您可以声明一个局部变量,该变量在设置完成之前会一直保持强引用。
// this gets called in a function
let modelImage = UIImageView()
modelImage.frame = CGRect(origin: CGPoint(x: modelSectionInfoCase.frame.width * 0.2, y: modelSectionInfoCase.frame.height * 0.1), size: CGSize(width: modelSectionInfoCase.frame.width / 5, height: modelSectionInfoCase.frame.height / 1.25))
modelImage.alpha = 1.0
modelImage.clipsToBounds = false
modelImage.isUserInteractionEnabled = true
modelImage.backgroundColor = UIColor.clear
modelImage.layer.setAffineTransform(CGAffineTransform(scaleX: -1, y: 1))
modelSectionInfoCase.insertSubview(modelImage, at: 0)
modelSectionInfoCase.bringSubview(toFront: modelImage)
self.modelImage = modelImage
(添加)
正如我在评论中指出的那样,UIView
一直强烈引用其子视图,因此我的代码有效。
但这并不意味着您不能对任何子视图拥有另一个强引用。如果您没有理由设定自己的财产weak
,则可以像Sh_Khan的回答中所说的那样使其牢固。