THREAD 1:EXC_BREAKPOINT CALayer removeAllAnimations消息已发送至已解除分配的

时间:2017-10-11 08:23:05

标签: ios swift swift4 nszombie

有很多问题有相同的标题但不知何故我觉得每个案例都不同,因为我的问题仍未解决,我不知道为什么,也没有足够的Swift解决方案。所以这是我的场景:

我使用CarbonKit在一个视图控制器中显示4个视图控制器。 FourthViewController使用AlamoFire发送来电。它成功加载数据并重新加载tableView。但是,当我拖动此表格视图时,我的应用程序崩溃了,我得到EXC_BREAKPOINT,有时EXC_BAD_ACCESS也是如此。

这是我尝试过的:

  1. 在搜索时我开始了解僵尸。所以我启用了它,当应用程序给我EXC时,我得到了这个:
  2.   

    - [CALayer removeAllAnimations]:发送到解除分配实例的消息

    所以当我检查时,我可能没有在这个课程中使用过的动画。但考虑到它在CarbonKit中,它们可能与它有关,但我无法弄明白。

    1. 我运行产品>从xCode分析,大​​多数蓝色图标都在FBSDK上,这与此类无关,因此根本不需要调试。
    2. 以下是截图: EXC_BREAKPOINTEXC_BAD_ACCESS 以下是Instruments 9.0僵尸消息给我的信息: Zombie MessageMore Detailed Zombie

      我在xCode的控制台中得到这个: enter image description here 如果您需要更多信息,我会更新我的问题。

      更新
      当我使用Alamofire从网上获取数据时,这是我的代码。现在这个调用成功运行,我可以向下滚动查看表中加载的所有数据。但是当我向上滚动时,它会因上述错误而崩溃。

      let headers = [
                  "security-token": "MY_SECURITY_CODE_HERE",
                  "Content-Type": "application/x-www-form-urlencoded"
              ]
      
              let url = "URL_GOES_HERE"
              //print(url)
              Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
      
                  if let result = response.result.value as? [String: AnyObject] {
      
                      switch response.result {
                      case .success:
                          if result["status"] as! Int == 0
                          {
                              self.clearAllNotice()
                              let alert = UIAlertController(title: "Error",
                                                            message: "\(result["msg"] ?? "Our Server is not responding at the moment. Try again later!" as AnyObject)",
                                  preferredStyle: UIAlertControllerStyle.alert)
      
                              let cancelAction = UIAlertAction(title: "OK",
                                                               style: .cancel, handler: nil)
      
                              alert.addAction(cancelAction)
                              self.present(alert, animated: true)
                          }
                          else
                          {
                              self.clearAllNotice()
      
                              for docReviewDict in (result["data"] as! [AnyObject]) {
      
                                  let docReview = DoctorReview(dict: docReviewDict as! [String : AnyObject])
                                  self.mainDoctorReviewsArray.append(docReview)
                              }
      
                              self.tableView.reloadData()
                          }
                      case .failure(let error):
                          self.clearAllNotice()
                          let alert = UIAlertController(title: "Something is wrong",
                                                        message: error.localizedDescription,
                                                        preferredStyle: UIAlertControllerStyle.alert)
      
                          let cancelAction = UIAlertAction(title: "OK",
                                                           style: .cancel, handler: nil)
      
                          alert.addAction(cancelAction)
                          self.present(alert, animated: true)
                      }
                  } else {
                    print("Somethins is wrong with the URL")
                  }
              }
      

      以防万一这是在tableview中加载的单元格。 enter image description here

      最新:

      基于评论我已经完成了这个:

      DispatchQueue.main.async {
                              self.tableView.reloadData()
                              }
      

      但仍然是相同的结果

        

      线程1:EXC_BAD_ACCESS(代码= 1,地址= 0xb4c4beb8)

      当我向下拖动表格视图时,在let cell = tableView.dequeueReusableCell(withIdentifier: "ReviewCell") as! ReviewsTableViewCell行上

      细胞的实施

      班级名称为ReviewsViewController,其中包含@IBOutlet fileprivate var tableView: UITableView!

      然后在viewDidLoad()

      tableView.delegate = self
      tableView.dataSource = self
      tableView.tableFooterView = UIView()
      

      然后我有表视图委托和数据源:

      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return mainDoctorReviewsArray.count
      }
      
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      
              let cell = tableView.dequeueReusableCell(withIdentifier: "ReviewCell") as! ReviewsTableViewCell //WHEN THE APP IS CRASHED AS I DRAG THE TABLE VIEW IT CRASH ON THIS LINE. As this line is highlighted in red with message "Thread 1: EXC_BREAKPOINT (code=1, subcode=0x186ddd61c)"
      
              cell.userPhoto.layer.cornerRadius = cell.userPhoto.frame.width / 2;
              cell.userPhoto.layer.masksToBounds = true
      
              cell.userName.text = mainDoctorReviewsArray[indexPath.row].name
      
              cell.starRating.settings.fillMode = .precise
      
              if let rate = mainDoctorReviewsArray[indexPath.row].rating
              {
                  cell.starRating.rating = Double(rate)!
              }
              else {
                  cell.starRating.rating = 0
              }
      
              cell.desc.text = mainDoctorReviewsArray[indexPath.row].feedback
              cell.dateOfReview.text = mainDoctorReviewsArray[indexPath.row].dates
              cell.timeOfReview.text = mainDoctorReviewsArray[indexPath.row].times
      
              return cell
          }
      

      在细胞类中只有:

      import UIKit
      import Cosmos
      
      class ReviewsTableViewCell: UITableViewCell {
      
          @IBOutlet var timeOfReview: UILabel!
          @IBOutlet var dateOfReview: UILabel!
          @IBOutlet var desc: UITextView!
          @IBOutlet var starRating: CosmosView!
          @IBOutlet var userName: UILabel!
          @IBOutlet var userPhoto: UIImageView!
          override func awakeFromNib() {
              super.awakeFromNib()
              // Initialization code
          }
      
          override func setSelected(_ selected: Bool, animated: Bool) {
              super.setSelected(selected, animated: animated)
      
              // Configure the view for the selected state
          }
      
      }
      

      tableView的屏幕截图在此问题的上方。

      这是4个ViewControllers加载的父类:dropbox.com/s/d5sh4ej1ssv6873/…这是具有tableview的类,在滚动时它崩溃了应用程序:dropbox.com/s/3kiju9hn3uewzar/ReviewsViewController.swift?dl‌​=0

4 个答案:

答案 0 :(得分:0)

如上所述,它可能与使用ui对象而非主线程有关。 如果您使用xCode 9,您应该将其视为运行时警告。 (您可以在EditScheme-> Diagnostics-> MainThreadChecker->问题中暂停设置复选标记。)

此外,您可以覆盖ReviewTableViewCell的dealloc方法并添加一些logs \ asserts以检查它是否从主线程调用。

通常情况下,如果您将view \ cell传递给某个块,并且在从块退出时释放此对象时会发生此崩溃。

答案 1 :(得分:0)

我会提出一些小建议来清理你的代码。不确定它是否能解决问题,但它有助于确保您的问题不是基于一些微不足道的事情。

  1. 我不确定你在哪里调用它,但在请求加载完成处理程序中,请确保弱捕获self

    Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { [weak self] response in

    这样你就不会强迫对象保持活着,直到加载完成,这可能会导致它加载到错误的位置。

  2. 确保主线程上正在运行完成块(如上所述)。您正在调用UI,因此请检查它是否安全。

  3. 您的IB网点应声明为@IBOutlet weak var foo: UIView?您可能通过强烈引用这些视图来解决自己的问题。

  4. dequeueReusableCell(withReuseIdentifier:)可以返回nil。您应该使用dequeueReusableCell(withReuseIdentifier:for:) - 并且不要忘记先使用register(_:forCellWithReuseIdentifier:)注册单元格。

答案 2 :(得分:0)

您是否注册了细胞类类型?

如果没有在viewDidLoad中添加:

self.tableView.register(ReviewsTableViewCell.self, forCellReuseIdentifier: "ReviewCell")

接下来只是在cellForRow中将其出列:

let cell = tableView.dequeueReusableCellFor(identifier: "ReviewCell", indexPath: indexPath) as! ReviewsTableViewCell

检查错误是否仍在发生

答案 3 :(得分:0)

就我而言,这是在我执行此操作时发生的(myView是单元格上的子视图)

myView.layer.sublayers?.forEach { $0.removeFromSuperlayer() }

我没有发现任何东西可以从您的代码中删除一层,但是如果您在那之外做过,那么我认为这就是问题所在。