swift – ARC(自动引用计数)在行动中
发布时间:2020-12-14 05:03:39 所属栏目:百科 来源:网络整理
导读:我目前正在关注 Apple Documentation.这是我的问题: class Person { let name: String init(name: String) { self.name = name println("(name) is being initialized") } deinit { println("(name) is being deinitialized") }}class ViewController: UI
我目前正在关注
Apple Documentation.这是我的问题:
class Person { let name: String init(name: String) { self.name = name println("(name) is being initialized") } deinit { println("(name) is being deinitialized") } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() var reference1: Person? var reference2: Person? var reference3: Person? reference1 = Person(name: "John Appleseed") // prints "John Appleseed is being initialized reference2 = reference1 reference3 = reference1 reference1 = nil reference2 = nil } } 在reference1等于nil之后,ARC取消分配实例并打印“John Appleseed正在被取消初始化” 在reference3 = nil之后不应该解除分配吗? 解决方法
这里的问题是范围问题.我们可以通过断点找到更多信息.
在这里,我们在初始化reference1之前就停止了.所有变量都是nil: 并且在reference1初始化之后? 好的,让我们在reference2和reference3设置之后跳到前面: 所有三个变量都指向相同的内存位置,我们可以看到初始化程序只运行一次.这些都指向同一个位置. 让我们前进一步: reference1现在指向None.这是零. deinit mmethod没有被调用并打印出它的消息. 让我们再向前迈进一步: 现在reference1和reference2都是零.我添加的println语句被调用.但deinit没有运行,reference3不是零. 下一步是完全退出方法.一旦我们离开该方法,变量超出范围并且调用deinit: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |