[问题解决了!只是想知道为什么ios8和ios9之间存在这样的差异]这些天我正在制作一个寄存器视图控制器,面对一些关于弱引用的问题。
及以下是代码的一部分(swift)
当我使用iphone6 ios8.1时会出现问题 它崩溃了。然后我注意到这里的弱引用不合适。但是我的ios9 iphone6s代码运行良好。我在iphone6 ios8模拟器上运行此代码,应用程序崩溃了。所以我认为在处理ios8和ios9中的弱引用时有一些不同的东西,但谁可以解释为什么......?class VC: UIViewController {
weak var verifyTextField: UITextField?
override func viewdidload() {
//....
verifyTextField = newTextField();
view.addSubview(verifyTextField!);
}
func newTextField() -> UITextField {
let ntf = UITextField();
//do some settings to ntf;
return ntf;
}
}
答案 0 :(得分:1)
您将新的UITextField
实例设置为weak var verifyTextField
但在将其添加为子视图(增加保留计数)之前,它会被释放(由于var很弱,计数为0)所以verifyTextField!
崩溃,您遇到的崩溃很可能是着名的
在展开“可选
”时意外发现nil
很容易解决它
weak var
if let
代替)代码应如下:
class VC: UIViewController {
var verifyTextField: UITextField? //should not be weak
override func viewdidload() {
//....
verifyTextField = newTextField()
if let verifyTextField = verifyTextField {
view.addSubview(verifyTextField!)
}
}
func newTextField() -> UITextField {
let ntf = UITextField()
//do some settings to ntf
return ntf
}
}
答案 1 :(得分:-2)
看起来您的对象在初始化后立即被释放,因为您不会存储任何强引用。
试试这段代码:
override func viewdidload() {
//....
let verifyTextField = newTextField();
view.addSubview(verifyTextField);
self.verifyTextField = verifyTextField;
}
此处也不需要使用weak
引用,因为verifyTextField没有引用您的VC,因此您不会获得保留周期。