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 = self
或self.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 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/