加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Swift的方法中使自己虚弱

发布时间:2020-12-14 05:53:53 所属栏目:百科 来源:网络整理
导读:我有一个Swift类,需要存储一个自己的方法的表。不幸的是,这引起了一个引用循环,因为它的表保留了通过它存储的方法对self的引用。 漏洞代码示例如下: typealias Callback = ()-()class CycleInducingClass : NSObject { var myCallbacks = [Callback]() o
我有一个Swift类,需要存储一个自己的方法的表。不幸的是,这引起了一个引用循环,因为它的表保留了通过它存储的方法对self的引用。

漏洞代码示例如下:

typealias Callback = ()->()

class CycleInducingClass : NSObject {
    var myCallbacks = [Callback]()  

    override init() {
        super.init()
        myCallbacks.append(myInternalFunction)
    }

    func myInternalFunction() {
        NSLog("lolol: %d",self.myCallbacks.count)
    }
}

到目前为止,我发现的唯一解决方案是这样做:

myCallbacks.append({[unowned self] in self.myInternalFunction()})

这很丑陋,容易出错。有什么更好的想法?是否有一些技巧让功能引用本身弱?即使myCallbacks数组的类型为myCallbacks:[WeakCallback]()还是什么?据我所知,我甚至不能建立一个方便的功能,削弱了上面的丑陋的封面包装上的句法糖。

你可以为此建立一个功能。我不知道它是否会使其显着改善,但是容易出错。
func methodPointer<T: AnyObject>(obj: T,method: (T) -> () -> Void) -> (() -> Void) {
  return { [unowned obj] in method(obj)() }
}
...
myCallbacks.append(methodPointer(self,CycleInducingClass.myInternalFunction))

或者,您可以管理您的回调作为方法指针:

typealias Callback = (CycleInducingClass) -> () -> Void
...
myCallbacks.append(CycleInducingClass.myInternalFunction)

在这种情况下,当您打电话时,您需要通过自己(如果您没有真正做到这一点,这可能会很好):

self.myCallbacks[0](self)()

所有这一切都是基于一个事实,即一个带有签名(输入)的类型T的方法 – > (输出)等价于具有签名(T)的函数 – > (输入) – > (输出)。

如果你好奇(我是),在这种情况下,重写工作是正确的。因此,如果您将CycleInducingClass子类化并覆盖myInternalFunction,则将调用正确的版本。 (这真的让我感到惊讶,我还不知道为什么它的作品,但它是。)

编辑:这是答案:https://devforums.apple.com/message/1036509#1036509

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读