Swift,带闭包的观察者模式

标签 swift design-patterns observer-pattern

我正在尝试仅使用函数快速实现观察者模式:

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/

相关文章:

ios - 面朝上或面朝下风景方向

ios - 在 Swift 中使用 URLComponents 编码 '+'

java - Java中的回调和观察者模式有什么区别

casting - 获取包含特定键的 NSArray 中的所有 NSArray

WKWebView 中的 Javascript - evaluateJavaScript 与 addUserScript

design-patterns - Gradle Artifactory 依赖项 : SNAPSHOT pattern issues

c# - 要求基类的子级从基类调用方法的设计模式

sql - 更新插入是否违反单一职责原则?

python - 使用 ipywidgets 中的小部件的观察者模式

rx-java - 房间 : LiveData or RxJava? 使用哪个