线程 1:EXC_BREAKPOINT CALayer removeAllAnimations 消息发送到 deallocated

Posted

技术标签:

【中文标题】线程 1:EXC_BREAKPOINT CALayer removeAllAnimations 消息发送到 deallocated【英文标题】:THREAD 1: EXC_BREAKPOINT CALayer removeAllAnimations message sent to deallocated 【发布时间】:2017-10-11 08:23:04 【问题描述】:

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

我使用CarbonKit 在单个视图控制器中显示 4 个视图控制器。 FourthViewController 使用 AlamoFire 发送 get 调用。它成功加载数据并重新加载tableView。然而,当我拖动这个表格视图时,我的应用程序崩溃了,我得到了EXC_BREAKPOINT,有时也得到了EXC_BAD_ACCESS

这是我尝试过的:

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

-[CALayer removeAllAnimations]:消息发送到释放的实例

所以当我检查时,我可能没有在这堂课中使用过任何动画。但考虑到它在 CarbonKit 内部,他们可能与它有关,但我无法弄清楚。

    我从 xCode 运行 Product > Analyze,大​​多数蓝色图标都在 FBSDK 上,与此类无关,因此根本无法调试。

以下是截图: 和 这是 Instruments 9.0 僵尸消息给我的信息: 和

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

更新 这是我使用 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")
            
        

以防万一这里是表格视图中加载的单元格。

最新:

根据我所做的评论:

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

【问题讨论】:

检查您是否使用了 assign 而不是 strong/weak 作为任何属性的访问说明符。它可能会导致僵尸。 @PuneetSharma 不在我的代码中,但在我搜索 assign 时,我在我安装的许多 pod 中都得到了这个。 可能是UI相关的任务,不在主线程上执行。 您能通过 Alamofire 发布通话代码吗? @user3581248 请查看我的问题的更新部分。 【参考方案1】:

正如上面有人提到的,它可能与使用非主线程的 ui 对象有关。 如果您使用 xCode 9,您应该会看到运行时警告。 (您可以在 EditScheme->Diagnostics->MainThreadChecker->pause on issues 中设置复选标记。

您还可以覆盖您的评论表视图单元的 dealloc 方法并添加一些日志\断言以检查它是否是从主线程调用的。

如果您将视图\单元格传递给某个块,通常会发生这种情况,并且在退出块时释放该对象时会发生崩溃。

【讨论】:

我得到了这个:Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState] PID: 11684, TID: 3261572, Thread name: com.google.Maps.LabelingBehavior, Queue name: com.apple.root.default-qos.overcommit,当它在第一个标签上时。 [UIApplication applicationState] 不是问题。 这是我打开问题暂停时得到的结果。其他我得到问题中提到的问题。【参考方案2】:

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

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

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

    这样您就不会强制对象在加载完成之前保持活动状态,这可能会导致它加载到错误的位置。

    确保完成块(上面提到的)正在主线程上运行。您正在调用 UI,因此只需检查它是否安全。

    您的 IB 网点应声明为 @IBOutlet weak var foo: UIView? 强烈引用视图可能会给自己带来问题。

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

【讨论】:

得到了同样的错误:[CALayer removeAllAnimations]: message sent to deallocated instance 0x1c103e240Thread 1: EXC_BREAKPOINT (code=1, subcode=0x186ddd61c) 在问题中提到的那一行。【参考方案3】:

你注册了cell类类型吗?

如果不在viewDidLoad中添加:

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

接下来只需在 cellForRow 中将其出队:

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

检查错误是否仍然发生

【讨论】:

我是否需要这样做,因为单元格不在单独的 .xib 中 你是在问还是在说?呵呵。是的,您需要注册 ReviewCell。 只是确保...据我所知,如果我在表格视图中有一个原型单元格,我不需要注册它。但是,如果我将单元格放在单独的 .xib 上,那么我需要注册它。 啊好吧没意识到你连接了一个原型单元。那你就不需要注册了。您是否使用“ReviewCell”设置了单元格的标识符名称? 是的,我已经检查了三次:D【参考方案4】:

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

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

我没有发现任何从您的代码中删除层的内容,但如果您在此之外进行了删除,那么我认为这就是问题所在。

【讨论】:

以上是关于线程 1:EXC_BREAKPOINT CALayer removeAllAnimations 消息发送到 deallocated的主要内容,如果未能解决你的问题,请参考以下文章

Xcode: 如何修复线程 5: EXC_BREAKPOINT (code=1, subcode=0x10025c76c)

线程 1: EXC_BREAKPOINT(code = EXC_I386_BPT, subcode=0x0

SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃

SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃

prepareForSegue 错误线程 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)

线程 1:EXC_BREAKPOINT CALayer removeAllAnimations 消息发送到 deallocated