避免在Swift

时间:2019-05-28 18:41:13

标签: swift function-pointers

让我们从这个游乐场示例开始

示例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初始化被调用!

     

TestClass1 deinit被调用!

示例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初始化被调用!

     

func1被调用!

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

我找到了这个example和这个post,但是我无法在示例代码中实现它。

1 个答案:

答案 0 :(得分:3)

要修复此问题,您必须通过弱者调用func1。

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

这样,您可以防止保留周期。

此刻发生的事情是,您正在将实例函数分配给实例属性,该实例属性现在对您的函数有很强的引用。

希望这会有所帮助。