Bloqueo de class en producción pero no debugging

Tengo la siguiente class:

import UIKit class HeaderTableViewController: UITableViewController { var nonDefaultTitle : String? var data: [String: [String]] = [:] var headers : [String] = [] var bodys : [[String]] = [] init(displayData: [String: [String]]) { super.init(style: .Grouped) data = displayData for key in data.keys { headers.append(key) } for arr in data.values { bodys.append(arr) } } requinetworking init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } private override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) } override func viewDidLoad() { super.viewDidLoad() tableView.backgroundColor = UIColor.whiteColor() tableView.registerNib(UINib(nibName: "DefaultCustomCell", bundle: nil), forCellReuseIdentifier: "DefaultCustomCell") tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 50 tableView.sectionHeaderHeight = UITableViewAutomaticDimension; tableView.estimatedSectionHeaderHeight = 100; let nib = UINib(nibName: "HeaderTableHeaderView", bundle: nil) tableView.registerNib(nib, forHeaderFooterViewReuseIdentifier: "HeaderTableHeaderView") if let ttle = nonDefaultTitle { self.title = ttle } else { self.title = "Talking Tips" } } } // // MARK: Helpers // extension HeaderTableViewController { override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return headers.count } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let body = bodys[section] as [String] return body.count } override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let cell = self.tableView.dequeueReusableHeaderFooterViewWithIdentifier("HeaderTableHeaderView") let header = cell as? HeaderTableHeaderView header!.titleLabel.text = headers[section] return cell } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("DefaultCustomCell", forIndexPath: indexPath) as! DefaultCustomCell cell.titleLabel.text = bodys[indexPath.section][indexPath.row] cell.selectionStyle = .None return cell } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { } } // // MARK: The table headers // class HeaderTableHeaderView: UITableViewHeaderFooterView { @IBOutlet weak var titleLabel: UILabel! } // // MARK: Class that handles the HeaderTableLargeHeaderView (sorry for the terrible naming conventions) // class HeaderTableLargeHeaderView: UIView { // Our title label with autolayout constraints @IBOutlet weak var titleLabel: UILabel! // Convience method to load for xib class func instanceFromNib() -> UIView { return UINib(nibName: "HeaderTableLargeHeaderView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView } override func layoutSubviews() { super.layoutSubviews() } } 

Muy claro. Funciona bien si instalo a través de Xcode o AdHoc usando Diawi.

Sin embargo, si instalo a través de TestFlight o a través de AppStore, se bloquea cada vez … ¿Hice algo mal aquí? Los loggings de mi dispositivo me dan esto:

 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000000 Termination Signal: Segmentation fault: 11 Termination Reason: Namespace SIGNAL, Code 0xb Terminating Process: exc handler [0] Triggenetworking by Thread: 0 Filtenetworking syslog: None found Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 UIKit 0x0000000196387a4c __66-[UISectionRowData refreshWithSection:tableView:tableViewRowData:]_block_invoke + 424 1 UIKit 0x00000001963879f0 __66-[UISectionRowData refreshWithSection:tableView:tableViewRowData:]_block_invoke + 332 2 UIKit 0x0000000196347368 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 2712 3 UIKit 0x00000001963467e4 -[UITableViewRowData rectForFooterInSection:heightCanBeGuessed:] + 536 4 UIKit 0x0000000196346570 -[UITableViewRowData heightForTable] + 60 5 UIKit 0x00000001963463a4 -[UITableView _updateContentSize] + 220 6 UIKit 0x000000019634c918 -[UITableView setContentInset:] + 252 7 UIKit 0x0000000196320438 -[UIViewController _setNavigationControllerContentInsetAdjustment:] + 428 8 UIKit 0x000000019632017c -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 464 9 UIKit 0x0000000196322214 -[UINavigationController _layoutViewController:] + 160 10 UIKit 0x0000000196322094 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 416 11 UIKit 0x0000000196408a58 -[UINavigationController _startCustomTransition:] + 2076 12 UIKit 0x0000000196320d74 -[UINavigationController _startDefernetworkingTransitionIfNeeded:] + 676 13 UIKit 0x00000001963209dc -[UINavigationController __viewWillLayoutSubviews] + 64 14 UIKit 0x0000000196320940 -[UILayoutContainerView layoutSubviews] + 188 15 UIKit 0x0000000196265738 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1196 16 QuartzCore 0x000000019372e40c -[CALayer layoutSublayers] + 148 17 QuartzCore 0x00000001937230e8 CA::Layer::layout_if_needed(CA::Transaction*) + 292 18 QuartzCore 0x0000000193722fa8 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32 19 QuartzCore 0x000000019369fc64 CA::Context::commit_transaction(CA::Transaction*) + 252 20 QuartzCore 0x00000001936c70d0 CA::Transaction::commit() + 512 21 UIKit 0x000000019625ae08 _afterCACommitHandler + 324 22 CoreFoundation 0x00000001903cd7dc __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32 23 CoreFoundation 0x00000001903cb40c __CFRunLoopDoObservers + 372 24 CoreFoundation 0x00000001903cb89c __CFRunLoopRun + 1024 25 CoreFoundation 0x00000001902fa048 CFRunLoopRunSpecific + 444 26 GraphicsServices 0x0000000191d7d198 GSEventRunModal + 180 27 UIKit 0x00000001962d3818 -[UIApplication _run] + 684 28 UIKit 0x00000001962ce550 UIApplicationMain + 208 29 Care Com 0x00000001000db12c 0x1000b4000 + 160044 30 libdyld.dylib 0x000000018f2dc5b8 start + 4 

Así que he podido rastrear el problema cambiando mi esquema de ejecución de debugging a versión. Este es el error que se está estrellando:

 malloc: *** mach_vm_map(size=8589934592) failed (error code=3) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug 

Entonces encontré lo que pensé que era la solución, pero no estoy seguro de por qué funciona. Estaba recibiendo el error indicado anteriormente en esta línea:

 bodys[section].count 

Si cambio esto:

Optimization Level: Fast, Single-File Optimization [-0]

a

Optimization Level: None [-Onone]


Por lo tanto, la corrección anterior funciona cuando se instala a través de Xcode y TestFlight, sin embargo, se cuelga cuando se descarga desde la tienda de aplicaciones … todavía se abre y busca una solución.


Intenté cambiar mi método init a esto:

 init(displayData: [String: [String]]) { super.init(style: .Grouped) //data = displayData // I get a bad access error thrown when trying to access displayData print(displayData) for key in displayData.keys { headers.append(key) } for arr in displayData.values { bodys.append(arr) } } 

y volví a convertir la optimization en la que me da un EXC_BAD_ACCESS cuando bash usar el parámetro init.


También ejecuté con instrumentos sin la optimization para comprobar si hay fugas y asignaciones de memory y aquí es lo que obtuve. Esta es la versión que se ejecuta bien a través de TestFlight y Xcode, pero se bloquea cuando se instala a través de AppStore. Las flechas rojas son cuando presioné hacia las vistas que se están estrellando en la producción.

Asignaciones de memory: introduzca la descripción de la imagen aquí

Fugas: introduzca la descripción de la imagen aquí


Aquí es cómo estoy instanciando y empujando la vista:

 func testPush() { let data = createTestData() let tableHeaderVC = HeaderTableViewController(displayData: data as! [String : [String]]) self.navigationController?.pushViewController(tableHeaderVC, animated: true) } func createTestData() -> [String : [String]] { let firstSection = ["Row one", "Row two"] let secondSection = ["Row one", "Row two"] return ["First" : firstSection, "Second" : secondSection] } 

Además, después de mirar esta pregunta, pensé que tal vez era un problema hacer un inicializador personalizado. Así que eliminé eso y lo hice donde establecí la variable antes de presionar … todavía obteniendo el mismo error con la optimization.