2017-06-22 74 views
0

由於客戶的要求,我有一個基於外觀的項目設計。我想知道哪種方法具有最少的內存消耗,哪種方法更好。快速關閉和內存泄漏

class ModFirst: NSObject { 
    func getCells(tableView: UITableView, rtn: @escaping ([Any]?) -> Void) { 
     print("ModFirst- getCells") 
     TableCellFirst().cells(tableView: tableView, rtn: { (cells) in 
      rtn(cells) 
     }) 
    } 
} 


class ModThird: NSObject { 
    lazy var tableCellThird: TableCellThird? = TableCellThird() 
    func getCellsNew(rtn: @escaping ([Any]?) -> Void) { 
     print("ModThird - getCellsNew") 
     self.tableCellThird?.cellsNew(rtn: { (cells) in 
      rtn(cells) 
     }) 
    } 

    deinit { 
     print("deinit - ModThird") 
     self. tableCellThird = nil 
    } 

} 

以上是兩種不同的實現方式。第一種方法立即分配TableCellFirst對象並調用getCells方法。這個實現沒有任何內存泄漏。但第二個實現使用惰性變量和deinit,但在使用Instruments進行性能分析時仍然存在內存泄漏。

那麼哪種方法是最好的方法,哪種方法在泄漏時更安全?

+0

看到這一點:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID48 – KKRocks

回答

0

它可能不明顯,但在第二種情況下,我有一個很強的參考週期(我猜它在rtn閉包定義中)。你可以在閉包中定義一個捕獲列表來避免這種情況。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

在捕獲列表中的每個項目是一類實例的引用弱或無主關鍵字的配對(如自)或可變的一些值進行初始化(例如,委託= self.delegate!)。這些配對寫在一對方括號內,用逗號分隔。

0

我想這是因爲tableCellThird財產持有強引用其關閉(RTN:)。

如果您通過自我捕獲參考關鍵字,所以它將被持有強烈的參考。

所以你需要使用你的財產沒有自我關鍵字如下。

tableCellThird?.cellsNew(rtn: { (cells) in 
      rtn(cells) 
     })