将数组传递给新的ViewController时EXC_BAD_ACCESS

时间:2015-11-19 11:43:52

标签: ios objective-c swift swift2 exc-bad-access

我正在从webservice(汽车数据)加载一些XML,创建一些汽车对象,并希望在TableViewController中显示它们。

当用户选择了开始和目的地位置时,我正在对网络服务进行异步调用,显示一个活动指示符,一旦数据加载,我就转到一个新视图。所以我有这样的事情:

 class NewReservationViewController : UIViewController {
       @IBAction func searchCarsClicked(sender: UIBarButtonItem) {

            //show load cars activity indicator
            loadingCarsActivityIndicator.startAnimating()

            //load available cars from webservice asyncronously
           DataManager.getAvailableCars([...parameter list...], carsLoadedCallback: carsLoaded)


        }

        func carsLoaded(loadedCars: [Car]) {
            //dismiss the waiting widget
            //trigger the segue and advance to the next screen

            loadingCarsActivityIndicator.stopAnimating()
            print("stopped cars loading activity indicator")
            print("cars loaded callback called")
            print("loaded \(loadedCars.count) distinct cars")

            self.cars = loadedCars
            performSegueWithIdentifier("showAvailableCars", sender: self)

        }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "showAvailableCars" {

            let carTableViewController = segue.destinationViewController as! CarTableViewController
            carTableViewController.cars = self.cars
            presentViewController(carTableViewController, animated: false, completion: nil)

        }
    }
}






class DataManager {


   class func getAvailableCars([...parameter list...], carsLoadedCallback: ([Car]) -> Void){
       Webservice.getAvailability([...parameter list...], completionHandler: { (data, response, error) in


           //parse xml
           //in the end I get an Array of Car objects


           var cars: [Car] = ...

           carsLoadedCallback(cars)

        })}
   }
}

当我使用在CarTableViewController类中创建的一些DummyData填充TableView时,它工作正常。但是,当我尝试将汽车数组传递给我的TableViewController时,我得到一个EXC_BAD_ACCESS代码= 2异常。据我所知,这是一种通常由损坏的指针引起的内存异常。所以我想我在我调用的静态方法中的静态DataManager类中创建的汽车数组被破坏了。但是我不确定,因为自动引用计数应该避免这种情况。

表视图甚至显示数据,但随后立即崩溃并出现EXC_BAD_ACCESS异常。我试图在XCode的断点选项卡中设置一个通用断点,但是我没有得到关于应用崩溃原因的合理错误消息。

您对此为何会有任何想法吗?如何获得更好的错误消息? 感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

首先检查此功能:

func carsLoaded(loadedCars: [Car])

它作为回调返回 - 它运行的是什么线程?主要还是背景? 你应该调用主线程

dispatch_async(dispatch_get_main_queue(), {
  performSegueWithIdentifier("showAvailableCars", sender: self)
})

如果没有帮助 - 提供在调试器中断的位置,我可以提供帮助并查看更多内容。

UPD:没有注意到,你为什么要做手工礼物?

presentViewController(carTableViewController, animated: false, completion: nil)

您的segue会自动显示视图控制器,您可以在故事板中更改它的样式(模态,推送)。

答案 1 :(得分:1)

我可以看到两个潜在的问题。第一个是你从一个可能不在主线程上的方法触发你的segue,你需要确保在主线程上完成这个。另一个问题是,在准备segue时,你要打开新的ViewController而不检查它,所以试试这个:

foreach

答案 2 :(得分:0)

正如你所说的表视图显示数据然后立即崩溃我会认为问题出在你的CarTableViewController中。你可以检查的一件事是你的单元格被渲染,如果你试图从Car对象访问一些空的信息