2015-08-08 4 views
0

Невозможно определить эту утечку. Через 2 часа я прибегаю к вашей помощи.Утечка памяти UITableviewController от libswiftCore.dylib

Когда я перехожу обратно к моему настольному виду, у меня все течет. Я использую пользовательскую ячейку tableview.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ClientTableViewCell 
    var client = SharedData.sharedClientList[indexPath.row] 
    //cell.fillData(client) 

    cell.nameLabel.text = client.clientName 

    var tempNeeds = client.needsAsOneStringList() 

    var multipleWord = tempNeeds.removeAtIndex(0) 

    var others = " | ".join(tempNeeds) 
    cell.needLabel.text = "\(multipleWord) \(others)" 

    cell.foundAddressLabel.text = "Map Location: \(client.placemark.subThoroughfare) \(client.placemark.thoroughfare) \(client.placemark.locality) \(client.placemark.postalCode)" 
    cell.expectedAddressLabel.text = "Searched Location: \(client.importedAddress)" 

    cell.hidden = false 
    cell.accessoryType = .None 

    if !client.isBase { 
     if client.clientsBaseAssociation != nil { 
      cell.hidden = true 
     } 
    } 
    else { 
     cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator 
     cell.expectedAddressLabel.text = "" 
     cell.foundAddressLabel.text = "\(client.placemark.subThoroughfare) \(client.placemark.thoroughfare) \(client.placemark.locality) \(client.placemark.postalCode)" 
    } 

    return cell 
} 

я есть метод fillData внутри пользовательской ячейке, но переехал его, как я думал, что я, возможно, причина - не было. Вот клетка

import UIKit 

class ClientTableViewCell: UITableViewCell { 

@IBOutlet weak var nameLabel: UILabel! 
@IBOutlet weak var needLabel: UILabel! 
@IBOutlet weak var expectedAddressLabel: UILabel! 
@IBOutlet weak var foundAddressLabel: UILabel! 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
} 

} 

IOS 8,4/Xcode 6,4

enter image description here

enter image description here

Ближе к проблеме

enter image description here

+0

Методом исключения, это не должно быть в 'client.needsAsOneStringList()'? Все остальное находится в стеке или связано с атрибутом многоразовой ячейки. Там, вероятно, недостаточно контекста для аутсайдеров, чтобы решить эту проблему. С ARC, разве это не сильный цикл ссылок? – BaseZen

+0

попробует .. и обновит вас – DogCoffee

+0

Являются ли какие-либо из этих «сложных» вычисляемых свойств? – BaseZen

ответ

0

Видимо (потому что я не хав e docs, чтобы это доказать), скрывающие многоразовые ячейки таблицы (.hidden унаследован от UIView) утечки памяти. Возможно, когда он скрыт, он считается уже не пригодным для повторного использования, но также неприемлем. В любом случае решение заключалось в том, чтобы прекратить использование этого конкретного метода скрытия соты для управления представлением таблицы и вместо этого группировать не отображаемые ячейки в разделы, которые были «логически обрезаны», то есть больше не были обнаружены протоколы dataSource и delegate методы. (Например, возвращать один меньше для подсчета раздела или вернуть счетчик нулевой ячейки для раздела «скрытых».)

Логического усечение может также работать в раздел, если один готов сделать reloadSection() и затем динамически пересчитывать индексы, так что все «скрытые» ячейки остаются вне, но остальные индексы смежны. В зависимости от размера базовой модели, возможно, придется получить Computer-Science-y, чтобы избежать алгоритмов повторной индексации O (n^2).

Аналогичная проблема в Objective-C была обнаружена в обзоре кода, но никогда полностью не объяснил: https://codereview.stackexchange.com/questions/42429/uitableview-hidden-section-causing-more-memory-allocations-every-time-on-pull

Смежные вопросы