首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios9和ios8中的弱引用

ios9和ios8中的弱引用
EN

Stack Overflow用户
提问于 2016-03-25 15:17:05
回答 2查看 133关注 0票数 0

问题解决了!我只是想知道为什么ios8和ios9会有这么大的差异,这几天我正在做一个寄存器视图控制器,并且面临着一些关于弱引用的问题。

下面是代码的一部分(Swift)

问题来了,当我使用iphone6 ios8.1时,它崩溃了。然后我注意到弱引用在这里是不合适的。但是代码在我的ios9 iphone6s中运行得很好。我在iphone6 ios8模拟器上运行了这段代码,应用程序崩溃了。因此,我认为在处理ios8和ios9中的弱引用时有一些不同之处,但是谁能解释为什么呢?

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-03-25 15:48:31

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

在展开可选的

修复它很容易

强制展开请勿使用weak var

  • Don't强制展开(改用if let )

代码如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-03-25 15:33:34

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

尝试以下代码:

代码语言:javascript
复制
override func viewdidload() {
   //....
   let verifyTextField = newTextField();
   view.addSubview(verifyTextField);
   self.verifyTextField = verifyTextField;
}

这里也不需要使用weak引用,因为verifyTextField没有对你的VC的引用,所以你不会得到一个保留周期。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36215661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档