UIImage糟糕的指示

时间:2015-09-15 07:56:00

标签: ios uiimage swift2 exc-bad-instruction

通过论坛,我发现这个问题不时出现。并且显然在广泛的不同情况下这样做。我找不到的似乎与我的相似。

我在创建可用的Twitter应用程序的过程中(课程)。测试它当前运行程序,没有任何错误。但是当我选择一个帐户时,程序崩溃并且在图像方法中显示错误消息,该方法应该加载所选用户的化身。我假设它根本无法检索有效图像或获取数据(因为调试区域中的行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     

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,发现我的图像是用坏数据初始化的。这就是说我从服务器请求的图像不存在,服务器发回了一个无法转换为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 {
           ...
           ...
        }

要:

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

通过这种方式,我检查了图像是否能够成功创建。如果无法创建图像,则代码将不会执行,您将不会收到错误。

如果您希望图片位于您在'imageURLString'中指定的网址,那么我建议您检查您正在使用的网址。

我还注意到你没有收到任何数据,这就是你无法创建UIIMage的原因。您可以测试以查看是否存在以下情况:

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

我希望我的回答很有帮助。如果您有任何问题,请随时发表评论,我会尽力回答。

更多信息在这里:
这个question & answer还提供了在无法从提供的数据中创建UIImage时如何处理大小写的方法。