【发布时间】:2020-11-12 03:57:22
【问题描述】:
我有一些代码可以正常运行很长时间,但突然导致运行时崩溃。这可能是因为这是它第一次获得 nil 值(由于某些故障或其他原因),但无论如何我的应用程序现在在启动时崩溃了。
代码是:
@objc func download(surl: NSString, completion : @escaping (NSData) -> Void ) {
print("surl to download is:",surl)//CRASHES HERE if surl is uninitialized.
它在错误指示的行崩溃:
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
这是调试器中显示崩溃时“单元化”的行。
我不愿意将 surl 更改为可选项,因为此方法在应用程序中被称为无数地方,我担心在方法中更改它会导致其他问题。
所以想找出一种方法来测试 surl 是否未初始化并在可能的情况下返回。
感谢您的任何建议。
编辑:
我在调用上述方法的方法中尝试了一个非零测试,并通过了非零测试。但是如果你尝试用它做点什么,它就会崩溃。此外,崩溃后在控制台中打印它会给出:(NSString) $R2 = <uninitialized>
这是截图:
【问题讨论】:
-
你确定你的代码在那里崩溃了吗?你为什么首先使用 NSString/NSData?
-
你的实现
surl不能是nil。如果是,编译器会抱怨(在编译时)。这就是 Swift 强类型系统的好处。错误必须在其他地方。正如 Leo 已经提到的,如果有原生 Swift 对应物,请停止使用NS...类。 -
@Leo Dabus 看起来代码在那里崩溃了。见截图。使用 NSString 因为这主要是一个 Objective-C 项目。然而,像这个这样的一些函数是用 Swift 编写的
-
@vadian。重新检查控制台,它显示“未初始化”。如前所述,此代码已在生产应用程序中运行了一年多,但不知何故,一个无效的值悄悄进入。不知道如何。可能是撞车什么的。将问题编辑为如何检查未初始化。归根结底,我需要测试未初始化的值,即使它们非常罕见,因为错误会阻止应用程序运行。
标签: ios swift string null optional