问题解决了!我只是想知道为什么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;
}
}发布于 2016-03-25 15:48:31
您将新的UITextField实例设置为weak var verifyTextField,但在将其添加为子视图之前(这会增加保留计数),它将被释放(由于var很弱,计数为0),因此verifyTextField!崩溃,您得到的崩溃很可能是著名的
在展开可选的
修复它很容易
强制展开请勿使用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
}
}发布于 2016-03-25 15:33:34
看起来你的对象在初始化后立即被释放,因为你没有为它存储任何强引用。
尝试以下代码:
override func viewdidload() {
//....
let verifyTextField = newTextField();
view.addSubview(verifyTextField);
self.verifyTextField = verifyTextField;
}这里也不需要使用weak引用,因为verifyTextField没有对你的VC的引用,所以你不会得到一个保留周期。
https://stackoverflow.com/questions/36215661
复制相似问题