【问题标题】:Make a copy of object with same address in swift快速复制具有相同地址的对象
【发布时间】:2018-07-20 04:45:30
【问题描述】:
var empObj : EmployeeModel!
var tempObj : EmployeeModel!

tempObj = empObj.copy() as! EmployeeModel

当我将empObj 复制到tempObj 时,它的内存地址已更改。我想防止这种情况发生吗?

【问题讨论】:

  • 这很明显,两个需要内存的对象怎么能在同一个地址?
  • 如果 EmployeeModel 是类,那么只需执行 tempObj = empObj 现在两个对象都将指向相同的地址,但一个对象的更改也会反映到另一个对象,因为通过 ref

标签: arrays swift nscopying


【解决方案1】:

当你复制它时,它实际上是在做一个新的参考。而不是复制只是分配值。那么两者将共享相同的引用

var empObj : EmployeeModel!
var tempObj = empObj

【讨论】:

  • 好的,但我不想在更改 empobj 时反映 tempobj 的任何更改。
  • 如果你想将 temp 对象与 empobj 分开,那么你必须给它单独的内存地址。
  • 在上述情况下,当您更改 empObj 时,tempObj 也会更改。
【解决方案2】:

当你想为不同的值使用相同的地址时

使用 =

例如。

var ogArray : NSMutableArray() var tempArray = ogArray

【讨论】:

  • 好的,但我不想在更改 empobj 时反映 tempobj 的任何更改。
【解决方案3】:

如果您使用对象,则两个变量可以指向同一个对象,因此更改一个对象会同时更改它们,而如果您尝试使用结构体,您会发现 Swift 创建了一个完整副本,因此更改副本不会影响原来的。 如果你想修改一个类对象的副本以便修改一个对象不会影响其他任何东西,你可以使用 NSCopying。

  • 使您的类符合 NSCopying。这不是严格要求的
  • 实现方法copy(with:),实际复制发生的地方。
  • 在您的对象上调用 copy()。

NSCopying 的示例代码

 class Person: NSObject, NSCopying {
    var firstName: String
    var lastName: String
    var age: Int

    init(firstName: String, lastName: String, age: Int) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
    }

    func copy(with zone: NSZone? = nil) -> Any {
        let copy = Person(firstName: firstName, lastName: lastName, age: age)
        return copy
    }
}

在 Playground 中检查此代码的输出

let paul = Person(firstName: "Paul", lastName: "Hudson", age: 36)
let sophie = paul.copy() as! Person

sophie.firstName = "Sophie"
sophie.age = 6

print("\(paul.firstName) \(paul.lastName) is \(paul.age)")
print("\(sophie.firstName) \(sophie.lastName) is \(sophie.age)")

Reference

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多