【问题标题】:Not able to decode value in a weak variable无法解码弱变量中的值
【发布时间】:2018-04-13 10:27:19
【问题描述】:
class User: Codable {

//MARK:- Properties
var firstName: String?
var lastName: String?
weak var friend: User?

enum CodingKeys: String, CodingKey {
    case firstName = "first"
    case lastName = "last"
    case friend
}

}

User 类有一个friend 属性,该属性将再次属于User 类型。因此,为了避免任何保留周期,我将其视为弱变量。但是当 JSONDecoder 解码 json 时,用户实例的朋友属性总是 nil。如果我在这种情况下把朋友当作弱者是错误的?如果正确,那么该值将如何插入到用户的朋友属性中。

另请阅读weak variable is intermediately nil。如果我不使用weak,会有保留周期吗?

【问题讨论】:

  • 为什么你的变量很弱?必须是强,默认没有弱
  • 如果朋友是强类型,不会有任何保留周期吗?由于 User 具有对friend 的字符串引用,并且friend 具有对 User 的强引用。
  • 检查我的答案
  • @ReinierMelian 谢谢,我现在很清楚保留周期

标签: ios swift4 codable


【解决方案1】:

在这种情况下,您的朋友变量必须是强大的,否则将在您的 init with coder 方法结束后被实例化并释放,将 weak var friend: User? 更改为此 var friend: User?

关于保留周期,只有在 self.friend.friend = selfself.friend = self 时,您才会获得保留周期

你可以随时检查一个对象是否在实现deinit 方法时被释放

示例

案例1

class ViewController: UIViewController {
    var user1 : User?
    var user2 : User?
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        user1 = User()

        user2 = User()
        user1?.friend = user2

        user1 = nil
    }

结果

user1 被释放

案例2

class ViewController: UIViewController {
        var user1 : User?
        var user2 : User?
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.

            user1 = User()
            user1?.friend = user1

            user1 = nil
        }

结果

user1 未解除分配 -> 保留周期问题

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2016-09-05
    • 2018-11-08
    • 1970-01-01
    相关资源
    最近更新 更多