ios9和ios8中的弱引用

时间:2016-03-25 07:17:05

标签: ios swift ios8 ios9

[问题解决了!只是想知道为什么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;
    }
}

2 个答案:

答案 0 :(得分:1)

您将新的UITextField实例设置为weak var verifyTextField但在将其添加为子视图(增加保留计数)之前,它会被释放(由于var很弱,计数为0)所以verifyTextField!崩溃,您遇到的崩溃很可能是着名的

  

在展开“可选

”时意外发现nil

很容易解决它

  1. 请勿使用weak var
  2. 不要强行打开(使用if let代替)
  3. 代码应如下:

    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,因此您不会获得保留周期。