UIImage Плохая инструкция

Просматривая форумы, я обнаружил, что эта проблема время от времени всплывает. И, по-видимому, делает это в широком спектре различных случаев. Ни один из тех, что мне удалось найти, не похож на мой.

Я на полпути к своей программе (уроку) по созданию полезного приложения для твиттера. Тестирование в настоящее время запускает программу как надо, без каких-либо ошибок. Но когда я выбираю учетную запись, программа вылетает и появляется сообщение об ошибке в методе изображения, который должен загрузить аватар выбранного пользователя. Я предполагаю, что он вообще не может получить действительное изображение или данные (из-за строки ImageData = (NSDATA?) nil в области отладки), но я ни в коем случае не уверен ни в чем, не говоря уже о том, как или где найти решение. Если я ищу с неправильными ключевыми словами, пожалуйста, дайте мне знать. (Я ищу ошибку exc_bad_instruction и uiimage) Заранее спасибо.

Ниже я опубликую фрагмент кода, в котором проявляется проблема, и то, что показано в области отладки ниже.

    if let cachedImage = image {
        cell.tweetUserAvatar.image = cachedImage
    }
    else {
        cell.tweetUserAvatar.image = UIImage(named: "camera.png")

        queue?.addOperationWithBlock() {
            let imageURL = NSURL(string: imageURLString) as NSURL!
            let imageData = NSData(contentsOfURL: imageURL) as NSData?
            let image = UIImage(data: imageData!) as UIImage? // EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subode=0x0)

            if let downloadedImage = image {
                NSOperationQueue.mainQueue().addOperationWithBlock(){
                    let cell = tableView.cellForRowAtIndexPath(indexPath) as! TweetCell

                        cell.tweetUserAvatar.image = downloadedImage
                }

                self.imageCache?.setObject(downloadedImage, forKey: imageURLString)
            }
        }
    }

Область отладки:

    imageURLString  String           
    "http://pbs.twimg.com/profile_images/465756113825067008/8jH2nZO0_normal.png"    
    tableView   UITableView 0x00007fc52481b400
    indexPath   NSIndexPath *   0xc000000000000016
    self Chapter7_8___Social_App.FeedViewController 0x00007fc5235f5ef0
    imageURL    NSURL! "http://pbs.twimg.com/profile_images/465756113825067008/8jH2nZO0_normal.png" 
    imageData   NSData? nil None
    image   UIImage?    0x000000010ee778dd
    downloadedImage UIImage     

person L. Klotz    schedule 15.09.2015    source источник


Ответы (1)


У меня тоже была эта проблема, и я обнаружил, что мой образ инициализировался с неверными данными. Это означает, что изображение, которое я запросил с сервера, не существовало, и сервер отправил ответ, который не мог быть преобразован в UIImage.

Чтобы смягчить это, вы можете сделать следующее:

if let cachedImage = image {
    cell.tweetUserAvatar.image = cachedImage
}
else {
    cell.tweetUserAvatar.image = UIImage(named: "camera.png")

    queue?.addOperationWithBlock() {
        let imageURL = NSURL(string: imageURLString) as NSURL!
        let imageData = NSData(contentsOfURL: imageURL) as NSData?

        if let image = UIImage(data: imageData!) {
            let downloadedImage = image
            NSOperationQueue.mainQueue().addOperationWithBlock(){
                let cell = tableView.cellForRowAtIndexPath(indexPath) as! TweetCell

                    cell.tweetUserAvatar.image = downloadedImage
            }

            self.imageCache?.setObject(downloadedImage, forKey: imageURLString)
        }
    }
}

То, что я сделал выше, изменено

        let image = UIImage(data: imageData!) as UIImage?

        if let downloadedImage = image {
           ...
           ...
        }

To:

        if let image = UIImage(data: imageData!) {
           let downloadedImage = image
           ...
           ...
        }    

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

Если вы ожидаете, что изображение будет находиться по URL-адресу, указанному вами в «imageURLString», я бы посоветовал вам проверить используемый вами URL-адрес.

Я также заметил, что вы не получили никаких данных, поэтому вы не можете создать UIIMage. Вы можете проверить, так ли это, со следующим:

let imageData = NSData(contentsOfURL: imageURL) as NSData?
if imageData != nil {
  Do More Stuff
  ...
{

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

Дополнительная информация здесь:
Это вопрос и ответ также предоставляет методы, как действовать в случае, когда UIImage не может быть создан из предоставленных данных.

person Average_Joe    schedule 12.03.2016