gpt4 book ai didi

ios - Swift 数组/集合内存管理

转载 作者:行者123 更新时间:2023-11-28 05:32:36 25 4
gpt4 key购买 nike

我花了一个多星期的时间阅读了各种在线文章和 StackOverflow 问答,了解 UIViewController 中 Swift 数组的内存管理,但我的应用程序仍然会崩溃。我希望你能帮上忙。

我有一个父类 Controller 和多个从父类继承的子类(使用示例简化),如下所示。

class ParentViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
lazy var results: [AnyObject] = [AnyObject]() //can contain various classes, such as Product, User, etc.

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return results.count
}

...
}


class SubViewController: ParentViewController {

... loads results Array via REST API, then then appends to array using
results.append(Product())

}

随机地,我会遇到这样的崩溃:

EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0000000a1abb4b17
Thread : Crashed: com.apple.main-thread
0 libobjc.A.dylib 0x000000019478fe10 cache_getImp + 16
1 libobjc.A.dylib 0x0000000194784a6c lookUpImpOrForward + 540
2 libobjc.A.dylib 0x000000019478fdb8 _objc_msgSend_uncached_impcache + 56
3 libswiftCore.dylib 0x00000001004d4e40 _ZN5swift12metadataimpl14ValueWitnessesINS0_17ObjCRetainableBoxEE18initializeWithCopyEPNS_11OpaqueValueES5_PKNS_8MetadataE + 24
4 libswiftCore.dylib 0x000000010036e3cc _TFSa6appendU__fRGSaQ__FQ_T_ + 92

根据我的理解,我认为这是因为在调用 results.append()results 已不在内存中。

在 UIViewController 中实例化数组/集合的最佳实践是什么,尤其是当有子类时?以下是我的一些想法,如有任何反馈,我们将不胜感激。

1.在父类中使用lazy。这是基本情况并导致崩溃

lazy var results: [AnyObject] = [AnyObject]()

2.在 SubViewController 中初始化,这仍然会导致崩溃,另外,我是否应该使用 deinit() 释放内存?

in ParentViewController
var results: [AnyObject]

in SubViewController
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.results = [Product]()
}

3.使results在父类中可选,这将要求父类中的所有方法检查可选值。我应该在子类的 init 中还是在 viewDidLoad() 中初始化数组?另外,我应该 deinit 结果吗?在父类中为零?

in ParentViewController
var results: [AnyObject]?

deinit {
results = nil
}

in SubViewController
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.results = [Product]()
}

如有任何建议,我们将不胜感激!

最佳答案

我不知道你的 View Controller 的生命周期和关系是什么,但我可靠地做到这一点的一种方法是将“结果”数组放置到你的 AppDelegate 中。这保证在您使用 View Controller 时存在并且可以从它们访问。

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
appDelegate.results.append(...)

关于ios - Swift 数组/集合内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27154340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com