0

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

在创建一个可用的 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     
4

1 回答 1

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”中指定的 url,那么我建议您检查您正在使用的 url。

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

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

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

更多信息在这里:
这个问题和答案还提供了如何处理无法从提供的数据创建 UIImage 的情况的方法。

于 2016-03-12T02:32:33.457 回答