加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读