带闭包的Swift,Observer模式
我试图在swift中仅使用函数实现观察者模式:带闭包的Swift,Observer模式,swift,design-patterns,observer-pattern,Swift,Design Patterns,Observer Pattern,我试图在swift中仅使用函数实现观察者模式: 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: \(
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
是否会在不清空数组的情况下被释放
第三个问题,对于只使用函数的观察模式,有更好的想法吗?(我不想使用协议)您误解了保留/释放周期。让我们逐行浏览您的代码:
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
不共享。第二个对象从不在闭包数组中
在我回答其他问题之前:你为什么要这么做?我在谷歌上找到了使用更好关键词的解决方案。
我需要使用闭包实现观察者模式,以避免原型,从而将观察者与观察者解耦。
观察者是一个具有闭包数组的对象,如下所示:
var数组:[()->()]=[]
每个可观察对象将其函数添加到此数组中,当需要时,观察者将调用此数组的每个或任何函数。
功能如下所示
lazy var someClosure:()->String={
[无主的自我,]在
//封闭体在这里
}
为避免保留循环,必须将自身
捕获为未发现
或弱
下面这篇文章详细介绍了这个解决方案:我猜“为什么”是“什么”。我试图实现一个观察者模式,而不使用类型。我有一个带有函数数组的类,像类a这样的对象会将它们的函数添加到数组中。需要时,将调用数组的每个函数。我可以用协议做同样的事情,但我想尝试一些不同的东西。