【问题标题】:ViewController passed as parameter is not being deinitialized (Swift)作为参数传递的 ViewController 未被取消初始化(Swift)
【发布时间】:2021-03-16 01:20:41
【问题描述】:

设置: 我有一个ViewController ProblemViewclass A。我将ProblemView 传递给A 类,所以我可以继续工作。它看起来像这样(简化):

class ProblemView: UIViewController{
    var instanceOfA = A()
    instanceOfA.passView(passedVC: self)
}

class A{
    var workOn = ProblemView()

    func passView(passedVC: ProblemView){
        workOn = passedVC
        // I noticed, if I declare a varible locally like var workOn2 = passedVC, my problem is solved - 
        // but I need the variable globally, because I don't want to pass it around within this class
    }
    func doSth(){
        // here I interact with variables of the passed ViewController
    }
}

问题:每当我在应用程序中重新启动此进程时,内存每次都会增加,直到出现内存错误。

我尝试了什么:我在两个类中都添加了deinitclass A 总是被取消初始化但class ProblemView 不是(这可能是问题?)。 我还发现,当我没有在全局范围内声明 workOn 而是在 passView 函数内声明时,它工作得很好。但我需要全局变量,因为我在A 的许多不同函数中使用它。有什么办法可以解决这个问题?

【问题讨论】:

  • 每次创建 A 都会创建一个 ProblemView 的实例,这会创建一个新的 A 实例,这会创建一个新的 ProblemView 实例...很明显 this 是您的内存问题,与deinit无关。
  • 感谢您的意见!有道理,但是当我不全局声明 ProblemView 的实例,而是在 passView 函数中本地声明时,为什么它会起作用?

标签: swift memory uiviewcontroller parameter-passing deinit


【解决方案1】:

相互之间的强引用。

尝试换A类:

weak var workOn: ProblemView?

func passView(passedVC: ProblemView){
    workOn = passedVC
    // I noticed, if I declare a varible locally like var workOn2 = passedVC, my problem is solved - 
    // but I need the variable globally, because I don't want to pass it around within this class
}
func doSth(){
    // here I interact with variables of the passed ViewController
}

【讨论】:

  • 哇,非常感谢!这完美解决了问题!必须看起来“弱”起来^^。您介意解释一下为什么 passView 函数中的本地声明变量 (workOn2) 也能正常工作吗?
猜你喜欢
  • 2019-12-31
  • 2014-05-24
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多