Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays swift中无引用循环的方法数组_Arrays_Swift_Function Pointers_Swift4.2 - Fatal编程技术网

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()
。。。