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中,当两个对象中的每一个都具有另一个对象的属性时,是否创建了一个保留周期?

用强弱自我打破保留周期

保留周期:为啥这是一件坏事?

iOS - 使用 CoreData 的 dispatch_async 保留周期

如何获取标注的 MKPlacemark 地址