简单快捷的代表在快速的操场上

Tom*_*ppy 5 delegates swift

我对Swift和一般编程非常陌生,有点像Fortran 77,以及最近一些简单的微控制器编程.我正在研究基础知识,一切顺利,直到我遇到了一些我无法理解的事情 - 代表们.所有的在线帖子都没有完全理解这个概念,至少对我而言,所以为了给自己一些我可以参考的东西,我在操场上设置了如下所示的基本模板.如果我运行下面的代码它工作并打印"完成的东西"到终端,但如果我使协议成为"类"协议,即"协议SomeDelegate:class {"并使"var委托"成为"弱var委托"按照各种帖子的建议,它不起作用 - 我做错了什么?

import UIKit

protocol SomeDelegate {
    func DoSomething()
}

class MyViewcontroller: UIViewController, SomeDelegate {

    func DoSomething() {
        print("Something done")
    }

}


class OtherClass {

   var delegate: SomeDelegate?


    func DoSomething() {

        delegate?.DoSomething()

    }
}


var myVar = OtherClass()
myVar.delegate = MyViewcontroller()
myVar.DoSomething()
Run Code Online (Sandbox Code Playgroud)

ff1*_*f10 4

它不会打印,因为委托在设置后立即为零。原因很简单:没有实例拥有它(引用计数为零)。没有人拥有,delegate因为您声明它是 OtherClass 的弱属性。尝试建立所有权,例如

\n\n
var myVar = OtherClass()\nlet viewController = MyViewController()\nmyVar.delegate = viewController\n
Run Code Online (Sandbox Code Playgroud)\n\n

即使委托很弱,它现在也会打印Something done再次打印。

\n\n

将委托声明为弱是有意义的,因为它可以防止循环引用导致委托永远不会在内存中释放 \xe2\x80\x93 这是一个完全不同的故事,尽管 \xe2\x80\x93 检查引用计数的工作原理,然后你就会明白为什么这是一个很好的做法。

\n