应用程序在设备上崩溃 - 在模拟器上完美运行
Application crashes on device - works perfectly on Simulator
最近在做一个应用。该应用程序的目标是向您显示在通知中心的“今日”视图中拍摄的最后 10 张照片等。该应用程序在 iOS 模拟器中运行完美,但一旦我将其放在真实设备上进行测试,它就会失败。它 returns 错误:
fatal error: Unexpected nil while unwrapping an Optional value
通常这很容易修复,因为 XCode 突出显示返回 nil 的代码并让您有机会修复它。在这种情况下,我的代码 none 会突出显示。相反,它突出显示线程 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 值,但代码似乎从未到达这一点。好像我的代码 none 是 运行.
有没有人遇到过 this/understands 错误代码(如果是这样的话)是什么意思这样的问题?我现在很绝望,所以我来了。
谢谢,
编程
编辑:
我在 viewDidLoad 函数中放置了一行 println 来仔细检查它是否是 运行。 println 函数 运行s 和输出正确,所以我想我可能只是以某种方式搞砸了我的断点。无论如何 - 代码 运行s,但它仍然没有突出显示我导致 nil 值的任何代码。
编辑 2:
根据要求,我插入了部分代码。请记住,这段代码是 "first draft",如果你愿意的话,我还没有抽出时间来清理它。我只是想让它工作:
@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() 等。
我认为不看您的代码就无法准确确定问题出在哪里。
您可能在代码中的某处强制向下转型了一个变量 as!
。如果您将其更改为:
if let variable = optionalVariable as? SomeClass {
//Insert your code
}
那么这应该可以解决您的问题。阅读本文以了解有关在 swift:
中投射的更多信息
我在尝试将非可选值设置为 nil
.
的隐式解包可选值时收到相同的错误
例如。 someGlobalFunction()
returns 具有 nil 值的 ImplicitlyUnwrappedOptional
然后您尝试将其设置为常规值。
func someGlobalFunction() -> String! { return nil }
class MyClass {
let aVariable: String
init() {
aVariable = someGlobalFunction()
}
}
即使是老问题。我通过从 xcode.
中删除派生数据发现了我的问题
Xcode -> window->Projects 然后 select 并删除你的项目派生数据。
您应该 运行 在模拟器和真实设备上使用相同的设备 device.As 例如,如果您在真实设备上 运行 5s 然后在 simulator.By 上尝试相同的设备 运行ning 模拟器,它肯定会显示 error.My 错误是没有连接@IBActions。希望这篇攻略对你有所帮助。
最近在做一个应用。该应用程序的目标是向您显示在通知中心的“今日”视图中拍摄的最后 10 张照片等。该应用程序在 iOS 模拟器中运行完美,但一旦我将其放在真实设备上进行测试,它就会失败。它 returns 错误:
fatal error: Unexpected nil while unwrapping an Optional value
通常这很容易修复,因为 XCode 突出显示返回 nil 的代码并让您有机会修复它。在这种情况下,我的代码 none 会突出显示。相反,它突出显示线程 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 值,但代码似乎从未到达这一点。好像我的代码 none 是 运行.
有没有人遇到过 this/understands 错误代码(如果是这样的话)是什么意思这样的问题?我现在很绝望,所以我来了。
谢谢, 编程
编辑: 我在 viewDidLoad 函数中放置了一行 println 来仔细检查它是否是 运行。 println 函数 运行s 和输出正确,所以我想我可能只是以某种方式搞砸了我的断点。无论如何 - 代码 运行s,但它仍然没有突出显示我导致 nil 值的任何代码。
编辑 2: 根据要求,我插入了部分代码。请记住,这段代码是 "first draft",如果你愿意的话,我还没有抽出时间来清理它。我只是想让它工作:
@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() 等。
我认为不看您的代码就无法准确确定问题出在哪里。
您可能在代码中的某处强制向下转型了一个变量 as!
。如果您将其更改为:
if let variable = optionalVariable as? SomeClass {
//Insert your code
}
那么这应该可以解决您的问题。阅读本文以了解有关在 swift:
中投射的更多信息我在尝试将非可选值设置为 nil
.
例如。 someGlobalFunction()
returns 具有 nil 值的 ImplicitlyUnwrappedOptional
然后您尝试将其设置为常规值。
func someGlobalFunction() -> String! { return nil }
class MyClass {
let aVariable: String
init() {
aVariable = someGlobalFunction()
}
}
即使是老问题。我通过从 xcode.
中删除派生数据发现了我的问题Xcode -> window->Projects 然后 select 并删除你的项目派生数据。
您应该 运行 在模拟器和真实设备上使用相同的设备 device.As 例如,如果您在真实设备上 运行 5s 然后在 simulator.By 上尝试相同的设备 运行ning 模拟器,它肯定会显示 error.My 错误是没有连接@IBActions。希望这篇攻略对你有所帮助。