MKPlacemark() 创建保留周期
Posted
技术标签:
【中文标题】MKPlacemark() 创建保留周期【英文标题】:MKPlacemark() creating retain cycle 【发布时间】: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
。
不错的收获,罗伯。谢谢!
【参考方案1】:
问题出在错误的初始化程序中。这是固定部分(使用 Xcode 12 / ios 14 测试)
struct MKPlaceChild: View
@Binding var showCreateEvent: Bool
@State private var selectedLandmark: Landmark = Landmark(placemark:
MKPlacemark(coordinate: CLLocationCoordinate2D())) // << here !!
...
【讨论】:
谢谢!知道为什么这会产生影响以及错误可能是什么吗?以上是关于MKPlacemark() 创建保留周期的主要内容,如果未能解决你的问题,请参考以下文章
从 MKPlacemark 创建 MKMapItem 时,MKMapitem 的 Placemark.name 为 nil
在RealmSwift中,当两个对象中的每一个都具有另一个对象的属性时,是否创建了一个保留周期?