我的目标是创建一个包含数组的类。数组的元素将是同一类的方法。喜欢:
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
方法中使用函数的本地副本。
答案 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)()
}
}
// ...
}
答案 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()