gpt4 book ai didi

swift - 当我设置实例变量时在 `top_level_code` 中访问错误

转载 作者:搜寻专家 更新时间:2023-11-01 05:41:56 26 4
gpt4 key购买 nike

好吧,这是一个奇怪的错误,我花了很多时间才找到确切的位置(尽管原因仍然未知)。错误发生在 64 位设备上。换句话说,它在我的 iPhone 5 上运行良好,但在我的 iPhone 6 Plus 上崩溃。

本质上,我在类中有一个私有(private)变量:

class Manager {
private lastUpdated:NSDate?
}

最初,它没有设置。此类从服务器检索消息,然后将 lastUpdated 变量设置为 NSDate()

  private func checkForNewMessages(complete:Result<[Message]> -> ()) {
self.server.userMessages(u, fromDate: self.lastUpdated) { result in
result.onSuccess { messages in
self.insertMessages(messages)
self.lastUpdated = NSDate()
complete(Result(messages))
}
result.onError { err in complete(Result(err)) }
}
}

我删除了无关代码,但代码路径中没有任何内容崩溃(只是它周围的东西)

注意:我使用的是 Result 枚举。有关这种枚举的更多信息,这篇文章很好地解释了它:Error Handling in Swift .

管理器第一次检索消息时,一切正常并且 lastUpdated 值设置正确。如果我随后再次尝试检索消息,应用程序会在尝试设置 self.lastUpdated = NSDate() 时崩溃。

如果我使用 GCD dispatch_after 延迟分配,我可以让它工作。但我不想那样做。

有人知道为什么会这样吗?

更新

  • 这仅在我分配 NSDate 时发生。如果我尝试设置另一个对象类型(IntBoolString)等,它不会发生。
  • 如果我将存储的变量更改为 NSTimeInterval 并尝试从 NSDate.timeIntervalSinceReferenceDate()
  • 设置它,则会发生崩溃
  • 如果我存储一个更新数组并尝试简单地将一个新日期附加到该数组,就会发生崩溃。
  • 如果我尝试在调用服务器之前而不是在回调中设置lastUpdated,就会发生崩溃。
  • 如果我将 NSDate 包装在另一个类中,就会发生崩溃。
  • 发生崩溃是因为我在后台线程中设置了lastUpdated
  • 如果我println(NSDate())(移除赋值)则不会发生崩溃

最佳答案

好吧,我花了好几个小时,但我终于弄明白了。

这会有点难以解释,我不确定我是否完全理解发生了什么。该错误实际上发生在发出请求的 Server 类中。它采用 lastUpdated 日期,将其转换为字符串,然后将其发送到服务器。第一次运行,没有日期,所以没有问题。在第二次运行中,它获取日期并使用日期格式化程序将其转换为字符串。但是,我认为 stringFromDate 返回了一个 Optional。它不是。通常,如果我试图解包一些不可行的东西,编译器会警告我。但是,我使用 Swift 的功能方面来使用 Infix 运算符来展开并有条件地将展开的值传递给另一个函数,然后该函数可以传递它的值。它允许我将 unwraps 链接在一起,这样我就可以避免“嵌套的 if-let hell”。

非常简单但功能强大:

infix operator >>? { associativity left}
func >>? <U,T>(opt: T?, f: (T -> U?)) -> U? {
if let x = opt {
return f(x)
}
return nil
}

请注意,该函数必须返回一个 Optional。出于某种原因,Swift 编译器忽略了 stringFromDate 没有返回可选值的事实,所以它没有警告我。我不确定为什么会这样,它之前肯定警告过我:

if let update = fromDate >>? self.dateFormatter.stringFromDate {

这会失败,但不会立即失败

展开非可选值不会立即导致崩溃、错误或任何明显的结果。我成功地使用日期字符串从服务器发送和接收数据。我不确定为什么展开非可选字符串之后会导致崩溃,并且当我尝试设置从中生成字符串的支持 NSDate 对象的实例变量时。我想不知何故,展开一个非可选的指针搞砸了一些指针,但不一定是指向展开对象的指针。我认为崩溃本身与 Swift 在设置新实例变量时尝试释放或释放原始实例变量 (lastUpdated) 有关,但发现内存地址困惑。我认为只有 Apple Swift 工程师才能告诉我实际发生了什么,但也许这里有关于 Swift 内部工作方式的线索。

关于swift - 当我设置实例变量时在 `top_level_code` 中访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28310598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com