THREAD 1: сообщение EXC_BREAKPOINT CALayer removeAllAnimations отправлено на освобожденный

Есть много вопросов с одинаковым названием, но почему-то я чувствовал, что каждый случай индивидуален, поскольку моя проблема до сих пор не решена, и я понятия не имею, почему, а также для Swift недостаточно решений. Итак, вот мой сценарий:

Я использовал CarbonKit, чтобы отобразить 4 контроллера представления в одном контроллере представления. FourthViewController отправляет вызов get, используя AlamoFire. Он успешно загружает данные и перезагружает tableView. Однако, когда я перетаскиваю это табличное представление, мое приложение падает, и я получаю EXC_BREAKPOINT, а иногда и EXC_BAD_ACCESS за одно и то же.

Вот что я пробовал:

  1. При поиске я узнал о зомби. Поэтому я включил его, и когда приложение дает мне EXC, я получаю это:

-[CALayer removeAllAnimations]: сообщение отправляется освобожденному экземпляру

Итак, когда я проверил, не было никакой анимации, которую я мог бы использовать в этом классе. Но, учитывая, что это внутри CarbonKit, они могут иметь к этому какое-то отношение, но я не могу понять это.

  1. Я запускаю Product > Analyze из xCode, и большинство синих значков находятся на FBSDK, которые не имеют ничего общего с этим классом, поэтому отладка вообще бесполезна.

Вот скриншоты: EXC_BREAKPOINT и EXC_BAD_ACCESS и вот что мне дало сообщение о зомби из 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 ViewController: dropbox.com/s/ d5sh4ej1ssv6873/… И это класс, который имеет табличное представление, и при прокрутке он разбил приложение: dropbox.com/s/3kiju9hn3uewzar/ReviewsViewController.swift?dl‌​=0


person Chaudhry Talha    schedule 11.10.2017    source источник
comment
Проверьте, использовали ли вы назначение вместо сильного/слабого в качестве спецификатора доступа для любого из ваших свойств. Это может привести к зомби.   -  person Puneet Sharma    schedule 11.10.2017
comment
@PuneetSharma не в моем коде, но когда я ищу assign, я получаю это во многих модулях, которые я установил.   -  person Chaudhry Talha    schedule 11.10.2017
comment
Это может быть задача, связанная с пользовательским интерфейсом, которая не выполняется в основном потоке.   -  person vadian    schedule 11.10.2017
comment
не могли бы вы опубликовать код для звонка через Alamofire?   -  person user3581248    schedule 30.10.2017
comment
@ user3581248, пожалуйста, ознакомьтесь с обновленной частью моего вопроса.   -  person Chaudhry Talha    schedule 30.10.2017
comment
Мое предложение было бы выполнить некоторую malloc_history отладку, наиболее вероятной причиной должно быть assign или removeFromSuperlayer неправильное использование.   -  person Cytus Chang    schedule 31.10.2017
comment
отправить основную очередь для перезагрузки табличного представления.   -  person Dattatray Deokar    schedule 15.11.2017
comment
@DattatrayDeokar, но помещая представление таблицы внутрь DispatchQueue.main.async, я получаю ту же ошибку EXC_BAD_ACCESS. Вы можете увидеть больше в последнем разделе вопроса.   -  person Chaudhry Talha    schedule 15.11.2017
comment
Вы удалили какой-либо ярлык, но не удалили IBOutlet?   -  person Dattatray Deokar    schedule 15.11.2017
comment
Если возможно, предоставьте мне свою раскадровку и класс ViewController.   -  person Dattatray Deokar    schedule 15.11.2017
comment
@DattatrayDeokar это табличное представление с пользовательской ячейкой. Он корректно отображает данные. если есть, скажем, 2 строки, программа не вылетит. Но если строк больше и есть необходимость их перетащить, то происходит сбой.   -  person Chaudhry Talha    schedule 15.11.2017
comment
@DattatrayDeokar конечно... так ты хочешь все 5 классов? Поскольку я использую CarbonKit, и это представление является лишь одним из 4 представлений, отображаемых на вкладках.   -  person Chaudhry Talha    schedule 15.11.2017
comment
да, пожалуйста, предоставьте весь соответствующий код   -  person Dattatray Deokar    schedule 15.11.2017
comment
Давайте продолжим обсуждение в чате.   -  person Chaudhry Talha    schedule 15.11.2017
comment
Можешь выложить реализацию своей ячейки?   -  person Santhosh R    schedule 16.11.2017
comment
@SanthoshR обновил мой вопрос. Весь код находится в разделе IMPLEMENTATION OF CELL.   -  person Chaudhry Talha    schedule 16.11.2017
comment
это отображается для первой перезагрузки вашего tableView?   -  person bestiosdeveloper    schedule 16.11.2017
comment
@PramodKumarSaxena, да, когда я прокручиваю таблицу вниз, происходит сбой.   -  person Chaudhry Talha    schedule 16.11.2017
comment
не могли бы вы еще раз проверить, что ваша ячейка табличного представления ReviewsTableViewCell имеет тот же идентификатор, что и ReviewCell? В вашей раскадровке.   -  person bestiosdeveloper    schedule 16.11.2017
comment
@PramodKumarSaxena Только что проверил еще раз, это тот же идентификатор ReviewCell в коде и в инспекторе атрибутов. Сбой произошел только тогда, когда я начал прокручивать таблицу.   -  person Chaudhry Talha    schedule 16.11.2017
comment
@ChaudhryTalha Попробуйте очистить ваши drivedData, выйдя из Xcode и снова запустив его.   -  person bestiosdeveloper    schedule 16.11.2017
comment
удалить ячейку из очереди как таковую: var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) ​​if (cell == nil) {cell = UITableViewCell(style:UITableViewCellStyle.Subtitle, reuseIdentifier:cellReuseIdentifier)}   -  person Wayne    schedule 16.11.2017


Ответы (4)


Как упоминалось выше, это, вероятно, связано с работой с объектами пользовательского интерфейса не из основного потока. Если вы используете xCode 9, вы должны увидеть предупреждение во время выполнения. (Вы можете установить галочку в EditScheme->Diagnostics->MainThreadChecker->pause on Issues).

Также вы можете переопределить метод Dealloc вашего ReviewsTableViewCell и добавить несколько журналов\утверждений, чтобы проверить, вызывается ли он из основного потока.

Обычно это происходит, если вы передаете свое представление \ ячейку в какой-либо блок, и у вас будет этот сбой при освобождении этого объекта при выходе из блока.

person livsik    schedule 15.11.2017
comment
Я получил это: 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, когда он находится на первой вкладке. - person Chaudhry Talha; 15.11.2017
comment
[UIApplication applicationState] не является проблемой. - person livsik; 16.11.2017
comment
Это то, что я получил, когда включил паузу в задачах. Другое дело, что я получаю проблемы, упомянутые в вопросе. - person Chaudhry Talha; 16.11.2017

Я собираюсь сделать несколько небольших предложений по очистке вашего кода. Не уверен, что это решит проблему, но поможет убедиться, что ваша проблема не основана на чем-то тривиальном.

  1. Я не уверен, где вы это вызываете, но в обработчике завершения загрузки запроса обязательно зафиксируйте self слабо.

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

    Таким образом, вы не заставляете объект оставаться в живых до завершения загрузки, что может привести к его загрузке в неправильном месте.

  2. Убедитесь, что блок завершения (упомянутый выше) работает в основном потоке. Вы звоните в пользовательский интерфейс, поэтому просто проверьте его, чтобы быть в безопасности.

  3. Ваши торговые точки IB должны быть объявлены как @IBOutlet weak var foo: UIView? Вы можете создавать себе проблемы, строго ссылаясь на представления.

  4. dequeueReusableCell(withReuseIdentifier:) может вернуть nil. Вы должны использовать dequeueReusableCell(withReuseIdentifier:for:) - и не забудьте сначала зарегистрировать ячейку, используя register(_:forCellWithReuseIdentifier:).

person Guy Kogus    schedule 16.11.2017
comment
Получил ту же ошибку: [CALayer removeAllAnimations]: message sent to deallocated instance 0x1c103e240 и Thread 1: EXC_BREAKPOINT (code=1, subcode=0x186ddd61c) в строке, упомянутой в вопросе. - person Chaudhry Talha; 16.11.2017

Вы зарегистрировали тип класса ячейки?

Если не добавить в viewDidLoad:

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

Затем просто удалите его из очереди в cellForRow:

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

Проверьте, повторяется ли ошибка.

person lopes710    schedule 16.11.2017
comment
Нужно ли мне это делать, поскольку ячейка не находится в отдельном .xib - person Chaudhry Talha; 16.11.2017
comment
ты спрашиваешь или говоришь? хе-хе. Да, вам необходимо зарегистрировать ReviewCell. - person lopes710; 16.11.2017
comment
просто удостоверяюсь... Поскольку я знаю, что если у меня есть прототип ячейки в табличном представлении, мне не нужно ее регистрировать. Но если у меня есть ячейка в отдельном .xib, мне нужно ее зарегистрировать. - person Chaudhry Talha; 16.11.2017
comment
Ах, хорошо, я не понял, что вы подключили прототип ячейки. Тогда вам не нужно его регистрировать. Вы установили имя идентификатора ячейки с помощью ReviewCell ? - person lopes710; 16.11.2017
comment
ага, трижды проверял :D - person Chaudhry Talha; 16.11.2017
comment
Я предоставил код в Dropbox, который вы также можете скачать и посмотреть, сможете ли вы найти проблему. - person Chaudhry Talha; 16.11.2017
comment
Можете ли вы добавить VC, где объявлен tableView? - person lopes710; 16.11.2017
comment
dropbox.com/s/d5sh4ej1ssv6873/ это представление объявлены четыре VC. - person Chaudhry Talha; 16.11.2017
comment
Да, но в какой из этих 5 VC есть таблица, в которой происходит сбой при прокрутке вверх? - person lopes710; 16.11.2017
comment
В tableView ReviewsViewController. Этот класс можно загрузить с dropbox.com/s/3kiju9hn3uewzar/ - person Chaudhry Talha; 16.11.2017

В моем случае это произошло, когда я выполнил это (myView — это подвид в ячейке)

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

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

person Manabu Nakazawa    schedule 30.01.2020