【问题标题】:Application crashes on device - works perfectly on Simulator设备上的应用程序崩溃 - 在模拟器上完美运行
【发布时间】:2015-05-01 15:20:34
【问题描述】:

最近,我一直在研究一个应用程序。该应用程序的目标是向您展示您在通知中心的“今日”视图中拍摄的最后 10 张照片等。该应用程序在 iOS 模拟器中完美运行,但是一旦我将它放在真实设备上进行测试,它就会失败。它返回错误:

fatal error: Unexpected nil while unwrapping an Optional value

通常这很容易修复,因为 XCode 会突出显示返回 nil 的代码并让您有机会修复它。在这种情况下,我的代码都没有突出显示。相反,它突出显示了线程 1 中的一行(这是正确的术语吗?线程 1?),如下所示: 另请注意,突出显示的线上方是线

; function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded of Swift.(_fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> ()).(closure #2)

我在图片中包含了这一行,因为它的“fatalErrorMessage”部分。我怀疑这可能会提示我错误,但我不知道这意味着什么。我还没有到理解的地步。

另外,经过一番思考,我在 viewDidLoad() 函数处设置了一个断点,希望能跟踪任何 nil 值,但代码似乎永远也达不到这一点。好像我的代码都没有运行。

有没有人遇到过这样的问题/理解错误代码(如果是这样的话)的含义吗?我现在很绝望,所以我在这里。

谢谢, CodeIt

编辑: 我在 viewDidLoad 函数中放置了一条 println 行,以仔细检查它是否正在运行。 println 函数运行并正确输出,所以我想我可能只是以某种方式弄乱了我的断点。无论如何 - 代码运行,但它仍然没有突出显示我的任何导致 nil 值的代码。

编辑 2: 根据要求,我插入了部分代码。请记住,如果您愿意,此代码是“初稿”,我还没有开始清理它。我只是想让它工作:

@IBOutlet weak var currentPosLabel: UILabel!
var currentImgPos = 0
@IBOutlet weak var imageView: UIImageView!
var images: NSMutableArray!
var totalImageCountNeeded: Int!

func fetchPhotos() {
    images = NSMutableArray()
    totalImageCountNeeded = 10
    self.fetchPhotoAtIndexFromEnd(0)
}


func fetchPhotoAtIndexFromEnd(index: Int) {
    let imgManager = PHImageManager.defaultManager()

    var requestOptions = PHImageRequestOptions()
    requestOptions.synchronous = true

    var fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    if let fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions) {
        if fetchResult.count > 0 {
            imgManager.requestImageForAsset(fetchResult.objectAtIndex(fetchResult.count - 1 - index) as? PHAsset, targetSize: view.frame.size, contentMode: PHImageContentMode.AspectFill, options: requestOptions, resultHandler: { (image, _) in
                self.images.addObject(image)
                if index + 1 < fetchResult.count && self.images.count < self.totalImageCountNeeded {
                    self.fetchPhotoAtIndexFromEnd(index + 1)
                } else {
                    println("Completed array: \(self.images)")
                }



            })
        }
    }

}







override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewDidAppear(animated: Bool) {
    // NOTE: I am calling the fetchPhotos() function here since earlier in my debugging I thought the problem may be that I was calling it too early in the viewDidLoad function. It an incorrect theory, but it was worth a try.
    fetchPhotos()
    if images.count > 0 {
        imageView.image = images[1] as? UIImage
    }
}

我删除了一些我知道没有理由导致我的错误的代码部分,例如@IBActions、didReceiveMemoryWarning() 等。

【问题讨论】:

  • 明确一点,你设置了异常断点?
  • @Allan Chau,原来我只是通过一行代码点击侧边栏添加断点。这是异常断点吗?我不这么认为,但我不确定。我对不同类型的断点不是很熟悉。我刚刚尝试将异常断点设置为所有异常,但它停在同一区域。
  • 你找到解决办法了吗??即使我面临同样的问题..!!
  • @IrshadQureshi (这是对您问题的相当晚的答复。抱歉!)接受的答案是可能解决了我的问题的答案。但是,在 Swift 1.2 到 Swift 2.1 更新之后,我执行了在接受的答案中看到的步骤。在此更新中,XCode 可能会改变任何东西,所以我不确定接受的答案是否真的解决了问题。然而,这是最有可能的答案。我建议您尝试一下,然后告诉我们它对您的效果。

标签: ios swift null ios-simulator


【解决方案1】:

即使这是老问题。我通过从 xcode 中删除派生数据发现了我的问题。

Xcode -> window->Projects 然后选择并删除您的项目派生数据。

【讨论】:

  • 是解决错误的唯一方法吗?我也遇到了同样的问题
  • 我挖掘了项目并将其从 Swift 1 更新到 Swift 2.1。当我在我的设备上运行它时,它不再有错误。当我将它从 Swift 1 更新到 Swift 2.1 时,很多事情都可能发生变化,但在我的设备上运行它之前,我已经尝试了你的建议。我会接受你的答案,因为它可能是修复它的原因(尽管我永远不会知道它是答案还是其他东西)。
【解决方案2】:

我认为不查看您的代码就无法准确确定问题出在哪里。

您可能在代码中的某处强制向下转换了变量as!。如果您将其更改为:

if let variable = optionalVariable as? SomeClass {
    //Insert your code
}

那么这应该可以解决您的问题。阅读本文以了解有关 swift 投射的更多信息:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html

【讨论】:

  • 我已经完成并替换了我的“as!”用“as?”,但它仍然没有解决问题。感谢您的链接 - 我会看看并了解正确的铸造!此外,我已更新问题以包含我认为与回答此问题相关的代码。目前非常混乱。
  • 您是否已将代码放入您的应用委托中?我认为问题发生在此视图控制器调用 viewDidLoad 之前。也许检查你的故事板中的 currentPosLabel 或 imageView 链接。
  • 我的 AppDelegate 中没有多余的代码,并且我已经仔细检查了故事板项目中的所有链接。所有 IBOutlets/IBAction 均已正确连接。如果这些是连接问题,我希望它在模拟器上运行时会出现。我能想到的唯一导致问题的另一件事是我使用 App Groups 和 NSUserDefaults 在扩展程序和主应用程序之间传递数据,但是只有在按下“共享”按钮时才会调用这些数据。
  • 所以,请记住在我的主要帖子中我说过:“我在 viewDidLoad() 函数处放置了一个断点,希望能够跟踪任何 nil 值,但代码似乎从未达到这一点。好像我的代码都没有运行。”我只是在带有断点的模拟器(它工作的地方)中运行代码,我的断点也没有在那里被绊倒。我的断点显然不能正常工作,所以我会对此问题进行一些调查。然后也许我可以追踪我的流浪零值..现在,找出他们为什么不工作......
【解决方案3】:

你应该在模拟器和真实设备上运行相同的设备。例如,如果你在真实设备上运行5s然后在模拟器上尝试相同的设备。通过运行模拟器,它肯定会显示错误。我的错误是不是连接@IBActions。希望这篇小贴士对你有所帮助。

【讨论】:

    【解决方案4】:

    尝试将非可选值设置为隐式展开的可选值 nil 时,我收到了同样的错误。

    例如。 someGlobalFunction() 返回带有 nil 值的 ImplicitlyUnwrappedOptional,然后您尝试将其设置为常规值。

    func someGlobalFunction() -> String! { return nil }
    
    class MyClass {
        let aVariable: String
    
        init() {
            aVariable = someGlobalFunction()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 2017-08-06
      • 2011-08-29
      相关资源
      最近更新 更多