Deinit永远不会被称为内存问题

时间:2017-02-18 03:47:51

标签: ios swift scenekit

所以我的deinit func永远不会被叫,我已经找到了答案,但它们都不适合我。并且视图控制器因内存问题而不断崩溃。谢谢你的帮助!

这是我的代码:

Yaml

2 个答案:

答案 0 :(得分:1)

您可能需要在为数据服务提供的闭包中使用对self的弱引用或无主引用。或者,您可能希望查看该代码并确保它在您期望时释放它对此闭包的引用。给定observe动词,我希望它无限期地保留对此闭包的引用。所以我推荐这个:

  1. 在闭包中使用对self的弱引用
  2. 在您的dealloc或其他时间(如viewWillDisappear)中,告诉DataService您要取消订阅/停止观察。这很重要,这样你就不会遇到相反的问题:你的闭包内的悬空指针。
  3. 对于#1,关键部分就在你的闭包内,Swift有一个指定的方式来声明self应该是一个弱指针:

    DataService.instance.REF_USERS.child("\(info.userUid)").observe(.value, with: { (snapshot) in
    

    变为

    DataService.instance.REF_USERS.child("\(info.userUid)").observe(.value, with: { [weak self] (snapshot) in
    

    请注意,你也可以使用[unowned self],但是你会断言你知道当这个块执行时self将永远不会是非nil。当你传递给第三方时,我认为你不知道。因此,使用[weak self]然后您必须将self视为可选项,这对于这种情况非常有用!

答案 1 :(得分:0)

这会打电话给你的deinit

weak var weakSelf = self
DataService.instance.REF_USERS.child("\(info.userUid)").observe(.value, with: { (snapshot) in
     if let postDict = snapshot.value as? Dictionary<String, AnyObject>, let strongSelf = weakSelf {
        let key = snapshot.key
        strongSelf.user = Users(key: key, artistData: postDict)

        if let user = strongSelf.user {
            strongSelf.artistNameLbl.text = user.name
                strongSelf.artistImg.sd_setImage(with: URL(string: "\(user.profilePicUrl!)") , placeholderImage: UIImage(named:"Placeholder") , options: .continueInBackground)
        }
    }
})