我对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)
它不会打印,因为委托在设置后立即为零。原因很简单:没有实例拥有它(引用计数为零)。没有人拥有,delegate因为您声明它是 OtherClass 的弱属性。尝试建立所有权,例如
var myVar = OtherClass()\nlet viewController = MyViewController()\nmyVar.delegate = viewController\nRun Code Online (Sandbox Code Playgroud)\n\n即使委托很弱,它现在也会打印Something done再次打印。
将委托声明为弱是有意义的,因为它可以防止循环引用导致委托永远不会在内存中释放 \xe2\x80\x93 这是一个完全不同的故事,尽管 \xe2\x80\x93 检查引用计数的工作原理,然后你就会明白为什么这是一个很好的做法。
\n| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |