【问题标题】:Resolving ARC Strong Reference解析 ARC 强引用
【发布时间】:2014-09-18 10:15:57
【问题描述】:

我有一个为 TableView 创建一些问题的类的问题。有一个班级问题和一个班级问题,其中包含一个问题数组。

问题是,目前这些类之间的绑定很强大,因此 ARC 无法释放内存。我已经尝试过 Swift Book 中描述的关于弱引用或无主引用的事情,但我无法修复代码中的泄漏。

谁能帮助我,如何防止 Swift 在对象之间创建强关系,以便 ARC 可以释放已使用的内存?

提前致谢

class Questions {

var questions: [Question] = []

init() {

    let validJSONData = NSData(contentsOfFile : NSBundle(forClass:ViewController.self).pathForResource("data", ofType: "json"))
    let json = JSONValue(validJSONData)

    for item in json["questions"].array!
    {

        var rowhHeight:CGFloat = 44.00

        if(item["template"].string! == "textViewCell") {
            rowhHeight = 100.00
        }

        var newQuestion = Question(qIndex: item["qid"].integer!, qText: item["qtext"].string!, qTemplate: item["template"].string!, qHidden: item["hidden"].bool!, qRowHeight: rowhHeight)

        questions.append(newQuestion)


    }
}

func getQuestions() -> NSArray {
   return questions     
}

deinit{
    println("questionS deinitialized")
}

}

class Question: NSObject {

var qIndex: Int
var qText : String
var qTemplate : String
var qHidden : Bool
var qRowHeight : CGFloat

init(qIndex: Int, qText: String, qTemplate: String, qHidden: Bool, qRowHeight: CGFloat) {

    self.qIndex = qIndex
    self.qText = qText
    self.qTemplate = qTemplate
    self.qHidden = qHidden
    self.qRowHeight = qRowHeight
}

deinit{
    println("question deinitialized")
} 
}

【问题讨论】:

  • 为什么说你有泄漏?我没有看到保留周期,因为 Question 对象没有对数组的引用。数组需要对其元素的强引用。释放Questions 对象将允许释放元素。
  • 感谢您的回复。仪器告诉我我有一个泄漏(对于每个问题对象) - 当我检查循环和根时,我发现“没有 ivar”作为我数组中每个问题的泄漏。如何在 Swift 中释放对象?将其值设置为零?为什么我会泄漏 - 我想使用我的对象,我应该什么时候释放它?目前对内存管理有点沮丧;)
  • No iVar 只是意味着仪器无法找到指向问题的 iVar(正如您所期望的,因为它是保存参考的数组)。您可以尝试调用树视图,但我怀疑您没有问题 - 您从 Instruments 收到虚假报告。在 swift 中,您通过将对象引用设置为 nil 来释放它,因此您可以尝试将问题数组设置为 nil 作为测试,您应该会看到所有内容都已释放。您还可以通过向 deinit 添加消息来确认,如 Swift 书中所示。
  • 哦。你的意思是这个“泄漏”不是真正的泄漏?调用树是空的,所以你的意思是如果调用树是空的,我的内存泄漏没有真正的问题?那将是个好消息:)
  • 这是我的猜测。通过将数组设置为 nil 进行测试将是确认的好方法 - 应该释放内存。这可能与 Swift 仍处于测试阶段有关 - 也许 Instruments 还不知道 Swift 数组。

标签: ios swift


【解决方案1】:

可能是因为您的模型类将使用您的 Controller 类创建强循环引用,希望这能解决您的问题。

class Questions {

var questions: [Question]!

init() {
    questions = [Question]()
    let validJSONData = NSData(contentsOfFile : NSBundle(forClass:ViewController.self).pathForResource("data", ofType: "json"))
    let json = JSONValue(validJSONData)

    for item in json["questions"].array!
    {

        var rowhHeight:CGFloat = 44.00

        if(item["template"].string! == "textViewCell") {
            rowhHeight = 100.00
        }

        var newQuestion = Question(qIndex: item["qid"].integer!, qText: item["qtext"].string!, qTemplate: item["template"].string!, qHidden: item["hidden"].bool!, qRowHeight: rowhHeight)

        questions.append(newQuestion)


    }
}

func getQuestions() -> NSArray {
    guard let objQuestion = questions else{return NSArray()}
    return questions
}

deinit{
    println("questionS deinitialized")
}

}

class Question: NSObject {

var qIndex: Int!
var qText : String!
var qTemplate : String!
var qHidden : Bool!
var qRowHeight : CGFloat!

init(qIndex: Int, qText: String, qTemplate: String, qHidden: Bool, qRowHeight: CGFloat) {

    self.qIndex = qIndex
    self.qText = qText
    self.qTemplate = qTemplate
    self.qHidden = qHidden
    self.qRowHeight = qRowHeight
}
deinit{
    println("question deinitialized")
}

}

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2013-10-12
    • 1970-01-01
    • 2012-06-30
    • 2013-11-02
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多