【问题标题】:weak reference in ios9 and ios8ios9 和 ios8 中的弱引用
【发布时间】:2016-07-12 22:57:59
【问题描述】:

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

【问题讨论】:

标签: ios swift ios8 ios9


【解决方案1】:

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

在展开 Optional 时意外发现 nil

很容易解决

  1. 不要使用weak var
  2. 不要强制解包(改用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
    }
}

【讨论】:

  • 是的..我找到了这个解决方案,但只是想知道为什么 ios8 和 ios9 有这么大的区别。因为在 ios9 中,我的代码运行良好。
  • 谢谢你,我完全明白你的意思,当一个对象没有强引用点时,它会被释放。
【解决方案2】:

看起来您的对象在初始化后立即被释放,因为您没有为它存储任何强引用。

试试这个代码:

override func viewdidload() {
   //....
   let verifyTextField = newTextField();
   view.addSubview(verifyTextField);
   self.verifyTextField = verifyTextField;
}

这里也不需要使用weak引用,因为verifyTextField没有引用你的VC,所以你不会得到一个retain cycle。

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    相关资源
    最近更新 更多