UIImage 错误指令

Posted

技术标签:

【中文标题】UIImage 错误指令【英文标题】:UIImage Bad instruction 【发布时间】:2015-09-15 07:56:00 【问题描述】:

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

在创建一个可用的 Twitter 应用程序方面,我的程序(课程)已经完成了一半。测试它当前可以正常运行程序,没有任何错误。但是,当我选择一个帐户时,程序崩溃并且错误消息显示在应该加载所选用户头像的图像方法中。我假设它根本无法检索有效图像或获取数据(因为调试区域中的 ImageData = (NSDATA?) nil 行),但我对任何事情都不确定,更不用说如何或在哪里可以找到解决方案。如果我使用错误的关键字搜索,请告诉我。 (我正在搜索 exc_bad_instruction 和 uiimage 错误)提前致谢。

我将在下面出现问题的地方发布代码的 sn-p,以及下面的调试区域中显示的内容。

    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】:

我也遇到了这个问题,发现我的图像被错误的数据初始化了。也就是说我向服务器请求的图片不存在,服务器返回了一个无法转换为 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”中指定的 url,那么我建议您检查您正在使用的 url。

我还注意到您没有取回任何数据,这就是您无法创建 UIIMage 的原因。您可以通过以下方式进行测试,看看是否是这种情况:

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

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

更多信息在这里: 这个question & answer 还提供了如何处理无法从提供的数据创建 UIImage 的情况。

【讨论】:

以上是关于UIImage 错误指令的主要内容,如果未能解决你的问题,请参考以下文章

UIImage+Resize 类别扩展错误和警告 iOS 7

将文本添加到 UIImage ......错误的地方

SwiftUI 错误:无法转换“UIImage”类型的值?关闭结果类型“无效”

PFUser.current()?.saveInBackground 错误与 UIImage()

绘制 UIImage 时出现无效的上下文错误

UIImage 返回错误的宽度