【发布时间】:2020-07-27 02:16:36
【问题描述】:
我有一个 @State 属性,它使用我创建的结构(地标)进行了初始化,该结构接受 MKPlacemark。
@State private var selectedLandmark: Landmark = Landmark(placemark: MKPlacemark())
这是结构的代码:
import Foundation
import MapKit
struct Landmark {
let placemark: MKPlacemark
var id: UUID {
UUID()
}
var name: String {
placemark.name ?? ""
}
var title: String {
placemark.title ?? ""
}
var coordinate: CLLocationCoordinate2D {
placemark.coordinate
}
}
每当此视图中的任何状态/绑定变量有任何更新时,我都会收到 EXC_BAD_ACCESS 错误并且没有日志。如果我删除对 MKPlacemark 的引用,一切正常。这可能是强引用被保留在某处的情况吗?
重现步骤:
创建一个“子”视图:
import SwiftUI
import MapKit
struct MKPlaceChild: View {
@Binding var showCreateEvent: Bool
@State private var selectedLandmark: Landmark = Landmark(placemark: MKPlacemark())
var body: some View {
VStack {
Text("Hello, World!")
Button("Cancel") {
self.showCreateEvent = false
}
}
}
}
创建父视图:
struct MKPlaceParent: View {
@State var showCreateEvent: Bool = true
var body: some View {
VStack {
if showCreateEvent {
MKPlaceChild(showCreateEvent: $showCreateEvent)
} else {
Text("Hello")
}
}
}
}
如果您点击“取消”按钮,则会发生错误:( 任何帮助将不胜感激
【问题讨论】:
-
这一切都很有趣,但你认为它与“保留周期”有什么关系?
-
老实说,在这一点上,我不确定了。我最初的直觉是 MKPlacemark 正在创建对 Landmark 内每个属性的强引用,但我不完全确定这会发生
-
顺便说一句,但您肯定不希望这是一个计算属性:
var id: UUID { UUID() }。也许是let id = UUID(),所以它被初始化了一次,而且只有一次。但是对于计算属性,每次引用它时都会得到一个唯一的id。 -
不错的收获,罗伯。谢谢!
标签: ios swift xcode swiftui state