快速的方法数组,无需参考周期

时间:2019-03-07 07:25:07

标签: arrays swift function-pointers swift4.2

我的目标是创建一个包含数组的类。数组的元素将是同一类的方法。喜欢:

class MyClass {
    lazy var functions = [self.myFirstMethod, self.mySecondMethod]

    deinit {
        print("Deinit")
    }

    func myFirstMethod() {
        // Do Something
    }

    func mySecondMethod() {
        // Do Something
    }

    func executeAll() {
        for f in functions {
            f()
        }
    }
}

当我致电executeAll()时,它工作正常,并达到了预期的结果:

var myObject = MyClass()
myObject.executeAll()

问题是,它创建了参考周期。 MyClass的实例保存数组functions,而functions数组保存self。因此,如果我编写以下代码:

var myObject: MyClass? = MyClass()
myObject.executeAll()
myObject = nil

由于这个强大的参考周期,它不会调用deinit方法。 如何将方法指针添加为数组weak self?我不想在executeAll方法中使用函数的本地副本。

2 个答案:

答案 0 :(得分:2)

如果方法列表独立于特定实例,则可以将其设为 type属性,并避免引用循环:

final PTagData[][] datas = new PTagDatas[2][30];

for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 30; j++) {
        datas[i, j] = getTagDatas(i, j);
    }
}

数组元素是

类型的“咖喱函数”
class MyClass {
    static let functions = [myFirstMethod, mySecondMethod]

    func executeAll() {
        for f in MyClass.functions {
            f(self)()
        }
    }

   // ...
}

比较Instance Methods are “Curried” Functions in Swift

答案 1 :(得分:-1)

尝试这种方式

class Unowned<T: AnyObject> {
    unowned let value: T
    init(_ value: T) {
        self.value = value
    }
}

var myObject: MyClass = MyClass()
var myUnowned = Unowned(myObject)
myUnowned.value.executeAll()