尝试使用可选

时间:2018-08-05 22:25:00

标签: ios swift xcode optional

运行此代码时,我崩溃了。我确切地知道为什么,但是我不知道如何使它不崩溃。

代码:

// 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)

enter image description here

更新:

我需要保留“弱变量”,因为我遇到了内存问题。我正在尝试使用“弱变量”修复内存泄漏。不仅在此变量上,而且在具有相同逻辑的其他变量上。

2 个答案:

答案 0 :(得分:4)

就如警告所述,删除weak

var modelImage: UIImageView!

enter image description here

当您将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的回答中所说的那样使其牢固。