【问题标题】:Shallow copy vs deep copy issue iOS Swift浅拷贝与深拷贝问题 iOS Swift
【发布时间】:2017-04-21 14:13:48
【问题描述】:

我在 swift 3 中克隆对象时遇到问题。我想复制/克隆一个对象,然后想修改它的值,以便修改不会反映在实际对象上。这就是我所做的。

let patientInformation = PatientInformationController.shared().pateintInformation.copy() as! PateintInformation

patientInformation.firstName = "Some Name"

上面这行其实不仅仅是修改了本地副本,还影响了实际的 PatientInformationController.shared().pateintInformation.firstName PateintInformation 符合 NSCopying 协议。

我检查了两个对象(实际和副本)的内存地址,它们是不同的。

在 PatientInformation 类中:

required public init(instance: PateintInformation) {
    self.firstName = instance.firstName
}

public func copy(with zone: NSZone? = nil) -> Any { 
    return PateintInformation(instance: self) 
}

【问题讨论】:

  • 如果PatientInformationController.shared().pateintInformationpatientInformation确实引用了两个不同的对象实例,那么设置patientInformationfirstName不能同时改变PatientInformationController.shared().pateintInformationfirstName
  • 复制效果如何?你的代码是什么?你检查了firstName每个属性的地址吗?
  • 我已经实现了 NSCopying 协议的 copyWithZone:。
  • @A.Sen firstName 是 String 类型吗?
  • @EugeneLaminskiy 是的。

标签: ios swift clone deep-copy nscopying


【解决方案1】:

您错误地实现了类对 NSCopying 协议的一致性。您在副本和对象中具有相同的引用,这就是发生更改的原因。你可以看看here怎么做。

【讨论】:

  • 你知道吗? OP 还没有发布任何有用的代码来回答这个问题。
  • 这是我在 PatientInformation 类中使用的代码:public func copy(with zone: NSZone? = nil) -> Any { return PateintInformation(instance: self) }
  • 这对我来说很明显。如果在 copy() 之后,拷贝和对象都发生了变化,那么拷贝实现不正确。
  • @A.Sen 请发布构造函数
  • @EugeneLaminskiy 那我应该如何分配?下面是我的构造函数的样子: required public init(instance: PateintInformation) { self.firstName = instance.firstName }