ios - 无法解码弱变量中的值

标签 ios swift4 codable

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 时,用户实例的 friend 属性始终为 nil。如果我在这种情况下将 friend 视为弱者是错误的?如果它是正确的,那么该值将如何插入到用户的 friend 属性中。

另请阅读此 weak variable is intermediately nil .如果我不使用 weak,是否会有任何保留周期?

最佳答案

在此上下文中,您的 friend 变量必须是强变量,否则将在您的 init with coder 方法结束后实例化并释放,通过此 var friend 更改 weak var friend: User? : 用户?

关于retain cycles,只有在self.friend.friend = selfself.friend = self

时才会得到retain cycle

你总是可以检查一个对象是否被释放实现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 deallocated

案例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 don't deallocated -> Retain Cycle Issue

关于ios - 无法解码弱变量中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49814852/

相关文章:

ios - Firebase iOS 调试控制台未记录任何内容

Swift 4.0 解码器错误与闭包属性

json - 如果 json 数据包含新行 ("\n",Swift 4 无法正确解码)

ios - 在文本字段中键入时在文本字段字符之间添加连字符

ios - 从 Swift 4 新的键路径语法获取字符串?

swift - 使用协议(protocol)类型属性对结构进行解码/编码

ios - 无法转换 NSURL 类型的值? _ 类型的预期参数?

ios - 在 UIView.animate block 中多次设置不透明度会导致意外的初始动画条件

ios - 当更改数据源中的子对象时,UITableView reloadData 不起作用。

ios - UI TableView 错误 + 异步加载数据