簡體   English   中英

Swift數組/集合內存管理

[英]Swift arrays/collections memory management

我已經花了一個多星期的時間在線閱讀各種文章,以及有關UIViewController中Swift數組的內存管理的StackOverflow問答,但我的應用程序仍然崩潰。 希望您能提供幫助。

我有一個父類控制器和多個從父類繼承的子類(使用示例進行了簡化),如下所示。

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是在內存中不再受時間results.append()被調用。

在UIViewController中實例化數組/集合的最佳實踐是什么,特別是當存在子類時? 這是我的一些想法,任何反饋將不勝感激。

1.在父類中使用lazy 這是基本情況,並導致崩潰

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

2.在SubViewController中SubViewController ,這仍然會導致崩潰,另外,我應該使用deinit()釋放內存嗎?

in ParentViewController
var results: [AnyObject]

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

3.使results在父類中是可選的,這將需要父類中的所有方法來檢查可選項。 我應該在子類或viewDidLoad()中的init中初始化數組嗎? 另外,我應該deinit結果嗎? 在父母課堂上沒有?

in ParentViewController
var results: [AnyObject]?

deinit {
    results = nil
}

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

任何建議,將不勝感激!

我不知道您的視圖控制器的壽命和關系是什么,但是我可靠地做到這一點的一種方法是將“結果”數組放置到您的AppDelegate中。 當您使用視圖控制器時,可以保證存在該控件,並且可以通過它們進行訪問。

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

您是否要在主線程中添加從其余api獲取的結果? 如果沒有嘗試,請執行以下操作:

dispatch_async(dispatch_get_main_queue(), {
   results.append(objectsFromApi)
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM