我正在尝试仅使用函数快速实现观察者模式:
var closures: [() -> Void] = []
class A: NSObject
{
static var c = 0
var i = 0
override init()
{
super.init()
self.i = A.c
A.c += 1
}
func foo()
{
print("Hi: \(i)")
print("\(A.c)")
}
} // class
var aa:A? = A()
closures.append(aa!.foo)
for item in closures
{
item()
}
aa = A()
for item in closures
{
item()
}
这打印:
Hi: 0
1
Hi: 0
2
第一个问题,实例变量i
好像从来没有被修改过,你知道为什么吗?
第二个问题,会不会泄漏内存?由于我有一个函数数组,aa
是否会在不清空数组的情况下被释放?
第三个问题,对于仅使用函数的 Observe 模式有更好的想法吗? (我不想使用协议(protocol))
最佳答案
您误解了保留/释放周期。让我们逐行浏览您的代码:
var aa:A? = A()
初始化A
的新实例。此内存的保留计数为 1。
closures.append(aa!.foo)
将 A
的实例附加到 closures
数组。保留计数为 2。
for item in closures
{
item()
}
在 A
的第一个实例上调用 foo
。
aa = A()
创建 A
的另一个实例。第一个实例继续由数组保留,保留计数下降到 1。但是 A.c
递增,因为您在 init
方法中对其进行了编码。
for item in closures
{
item()
}
您仍在调用第一个对象的方法。 A.c
与第二个对象共享,但 i
不是。第二个对象永远不会在 closures
数组中。
在回答您的其他问题之前:您为什么要尝试这样做?
关于Swift,带闭包的观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39193910/