【发布时间】: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 数组。