【问题标题】:MKPlacemark() creating retain cycleMKPlacemark() 创建保留周期
【发布时间】: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


【解决方案1】:

问题出在错误的初始化程序中。这是固定部分(使用 Xcode 12 / iOS 14 测试)

struct MKPlaceChild: View {
    @Binding var showCreateEvent: Bool
    @State private var selectedLandmark: Landmark = Landmark(placemark: 
          MKPlacemark(coordinate: CLLocationCoordinate2D()))      // << here !!
    ...

【讨论】:

  • 谢谢!知道为什么这会产生影响以及错误可能是什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
相关资源
最近更新 更多