在Swift中使自身变得脆弱

wxs

我有一个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]()或什么?据我所知,我什至无法weaken在上述丑陋的封闭包装上构建作为语法糖的便捷功能

罗布·纳皮尔

您当然可以为此构建一个函数。我不知道它是否可以使它变得更好,但是它不容易出错。

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在呼叫他们时通过(如果您实际上不做很多事情,那可能会很好):

self.myCallbacks[0](self)()

所有这些都是基于这样一个事实,即T带有签名的类型方法(input) -> (output)等同于带有签名的函数(T) -> (input) -> (output)

万一您好奇(我曾经),在这种情况下,覆盖可以正常工作。因此,如果您子类化CycleInducingClass并重写myInternalFunction,则会调用正确的版本。(这实际上让我感到有些惊讶,但我还不知道它为什么起作用,但确实如此。)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法在“自身”中分配给“”-在Swift中使用元组

来自分类Dev

无法在“自身”中分配给“”-在Swift中使用元组

来自分类Dev

Swift使IBOulet变得强大

来自分类Dev

在 Java 中使 JSON 变得漂亮的最佳方法

来自分类Dev

Lisp变量在定义中使用自身

来自分类Dev

包含其自身类型属性的 Swift 类

来自分类Dev

在angular 8中使用Async变得不确定

来自分类Dev

在Scala中使用循环使事情变得不可变

来自分类Dev

Swift让类中的变量变得可变吗?

来自分类Dev

如何在ctypes中使用指向自身的指针设置结构?

来自分类Dev

在dispatch_async函数中使用弱自身

来自分类Dev

如何在自身内部的表中使用值(Lua语言)?

来自分类Dev

在Phaser.io中使组内的对象与自身碰撞?

来自分类Dev

如何修改在循环中使用自身的 Cow 变量?

来自分类Dev

Swift-在getter上返回其自身属性,并在setter上进行自身设置

来自分类Dev

如何在NSDate扩展Swift中更改自身?

来自分类Dev

Swift协议定义返回自身的类方法

来自分类Dev

如何在NSDate扩展Swift中更改自身?

来自分类Dev

Swift 变量不保值或以某种方式重置自身

来自分类Dev

如何在R {venn-gplots}中使Venn-Diagram变得丰富多彩?

来自分类Dev

在python中使用UTC偏移量变得疯狂(to_datetime熊猫函数和datetime对象)

来自分类Dev

在start_urls中使用时,变量变得不确定

来自分类Dev

没有LF的XML想要在shell中使用sed命令使其变得漂亮

来自分类Dev

在游戏循环中使用sleep()会使增量时间变得不稳定

来自分类Dev

在Swift中使用sortedArrayUsingSelector

来自分类Dev

在Swift中使用NSTimer

来自分类常见问题

在Swift中使用谓词

来自分类Dev

在Swift中使用标签

来自分类Dev

在Swift中使用<-

Related 相关文章

热门标签

归档