swift - 避免 Swift 中函数指针的保留循环

标签 swift function-pointers

让我们从这个 Playground 示例开始

示例 1

import UIKit

internal final class TestClass1 {
    var testVar: Int = 1

    internal init() {
        print("TestClass1 init is called!")
    }

    deinit {
        print("TestClass1 deinit is called!")
    }

    internal func func1() {
        print("func1 is called!")
    }
}

internal final class TestClass2 {
    init() {
        let testClass1: TestClass1 = TestClass1()
        testClass1.testVar = 10
    }
}

var testClass2: TestClass2 = TestClass2()

输出

TestClass1 init is called!

TestClass1 deinit is called!

示例 2

import UIKit

internal final class TestClass1 {
    internal final var funcPointer: (() -> ())!

    internal init() {
        self.funcPointer = self.func1
        print("TestClass1 init is called!")
    }

    deinit {
        print("TestClass1 deinit is called!")
    }

    internal func func1() {
        print("func1 is called!")
    }
}

internal final class TestClass2 {
    init() {
        let testClass1: TestClass1 = TestClass1()
        testClass1.funcPointer()
    }
}

var testClass2: TestClass2 = TestClass2()

输出

TestClass1 init is called!

func1 is called!

我的问题是,示例 2 中从未调用过 deinit() 方法。我认为存在一个保留周期,但我不知道如何修复它。

我找到了这个 example而这个 SO post但我无法在我的示例代码中实现它。

最佳答案

要修复它,您必须通过 weak self 调用 func1。

internal init() {
    self.funcPointer = { [weak self] in
        self?.func1()
    }
    print("TestClass1 init is called!")
}

这样您就可以防止保留循环。

此时发生的情况是,您正在将一个实例函数分配给您的实例属性,该实例属性现在对您的函数具有强引用。

希望这对您有所帮助。

关于swift - 避免 Swift 中函数指针的保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56348309/

相关文章:

xcode - 如果我有多个 SKaction,如何取消一个 SKaction

ios - 如何将用户 Facebook 的数据添加到 Firebase

ios - swift : "Mixing in"属性

c++ - 函数作为函数参数

c - C 中返回指针的函数

c - C 中的通用函数类型回调,如 javascript

c - 在 C 中使用 dlopen 时,是否有避免 dlsym 的优雅方法?

ios - 使用 Swift 在 UIWebView 内单击事件

ios - 如何在 Swift 中创建修改后的 Base64 编码 UUID?