Arrays swift中无引用循环的方法数组
我的目标是创建一个包含数组的类。数组的元素将是同一类的方法。比如:Arrays swift中无引用循环的方法数组,arrays,swift,function-pointers,swift4.2,Arrays,Swift,Function Pointers,Swift4.2,我的目标是创建一个包含数组的类。数组的元素将是同一类的方法。比如: class MyClass { lazy var functions = [self.myFirstMethod, self.mySecondMethod] deinit { print("Deinit") } func myFirstMethod() { // Do Something } func mySecondMethod() {
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
的实例包含数组函数
和函数
数组包含self
。所以如果我写下面的代码:
var myObject: MyClass? = MyClass()
myObject.executeAll()
myObject = nil
由于此强引用循环,它不会调用deinit
方法。
如何将方法指针添加到数组中作为
弱self
?我不想在executeAll
方法中使用函数的本地副本。如果方法列表独立于特定实例,则可以将其作为类型属性并避免引用循环:
class MyClass {
static let functions = [myFirstMethod, mySecondMethod]
func executeAll() {
for f in MyClass.functions {
f(self)()
}
}
// ...
}
数组元素是该类型的“curried函数”
(MyClass) -> () -> ()
比较。试试这个方法
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()
类无主{
无主出租价值:T
初始值(u值:T){
自我价值=价值
}
}
var myObject:MyClass=MyClass()
var myUnowned=未拥有(myObject)
myUnowned.value.executeAll()
为什么不将您的函数声明为可选变量,并在执行后将其设置为nil,因为您希望在执行后将其释放。我担心这不会解决保留周期问题。如果在调用myUnowned.value.executeAll()
后设置myObject=nil
,则对象不会被解除分配。如果在调用myUnowned.value.executeAll()
之前设置了myObject=nil
,则会发生崩溃。您是在游乐场上这样做的吗?不是,在编译的项目中。操场不适合测试对象(de)分配。我知道,我们确保您不会尝试让myUnowned=Unowned(MyClass());myUnowned.value.executeAll()
。。。