当前位置: 首页 > 面试题库 >

阻止Swift中的保留周期?

叶卓君
2023-03-14
问题内容

传统上,在Objc中,我们会执行weakSelf来防止块的额外保留计数。

swift如何在内部管理Objc块中发生的保留周期?


问题答案:

为防止块对对象的强烈引用,必须为块定义捕获列表。

闭包表达式的语法定义如下:

{ ( /*parameters*/ ) -> /*return type*/ in

    // statements
}

但这会在文档的后面进行扩展以包括捕获列表。这实际上等效于如下定义的表达式语法:

{ [ /*reference type*/ /*object*/, ... ] ( /*parameters*/ ) -> /*return type*/ in

    // statements
}

…在哪里/*reference type*/可以是weakunowned

捕获列表是出现在闭包中的第一件事,它是可选的。如上所示,语法定义为一对或多对引用类型,后跟对象;每对之间用逗号分隔。例如:

[unowned self, weak otherObject]

完整的例子:

var myClosure = {
    [unowned self] in
    print(self.description)
}

请注意,unowned引用是非可选的,因此您无需解开引用。

希望能回答您的问题。您可以在文档的相关部分中详细了解Swift中的ARC

您应特别注意weak和之间的区别unowned。使用可能会更安全weak,因为using
unowned假设该对象永远不会为nil。如果对象在关闭中被使用之前实际上已经被释放,则可能导致您的应用程序崩溃。

使用weak作为参考类型时,您应使用来取消包装?,如下所示:

var myClosure = {
    [weak self] in
    print(self?.description)
}


 类似资料:
  • 问题内容: 由于磁盘空间的考虑,我只想在存储库中保留任何快照的一个版本。而不是保留带有时间戳后缀的多个版本 例如ecommerce-2.3-20090806.145007-1.ear 我该如何设置?这是构建设置还是存储库(Artifactory)设置 谢谢! 问题答案: 最简单(也是推荐的方法)是使用非唯一快照。如果必须使用唯一快照,则可以在Artifactory中执行此操作,方法是在artwor

  • 问题内容: 在使用惰性初始化程序时,是否有保留周期的机会? 在博客文章和许多其他地方都可以看到 我试过了 这样使用 并发现记录了“人deinit”。 因此,似乎没有保留周期。据我所知,当一个块捕获自身时,以及当该块被自身强烈保留时,会有一个保留周期。这种情况似乎类似于保留周期,但实际上并非如此。 问题答案: 我尝试过这个[…] 似乎没有保留周期 正确。 原因是考虑立即应用封闭。它不会保留捕获的内容

  • 问题内容: 我正在尝试基于指定的泛型类型进行强制转换和/或生成一个变量。我知道并没有快速的类型擦除,但是除了泛型的指定条件(例如符合基类)外,泛型似乎并没有保留类型。看来我可以强制转换或初始化的只是基类。更奇怪的是,当我在调试器中时,泛型似乎对正确的类具有RawPointer,甚至变量看起来都像是正确的类型: 编辑: 从Xcode 6.1开始,这仍然是一个问题(简化的代码由Gregory Higl

  • 问题内容: 我对Go如何处理非阻塞IO感到困惑。API在我看来基本上是同步的,并且在Go上观看演示时,听到诸如“和调用块”之类的注释并不罕见。 从文件或网络读取时,Go是否使用阻塞IO?还是当在Go Routine中使用某种魔术来重写代码? 来自C#背景,这感觉非常不直观,在C#中,当使用异步API时我们使用了关键字。这清楚地表明,API可以产生当前线程,并在以后的延续中继续。 因此,TLDR;当

  • 问题内容: 我只是想知道我是否正确理解了这一点。因此,根据苹果公司的文档,当您将闭包作为类实例的属性创建并且闭包引用self(创建闭包属性的类)时,这将导致强大的保留周期,最终该类或闭包都不会被释放。因此,用外行术语来说,这意味着如果我有一个具有属性的类并且该属性是一个闭包,并且一旦我在声明闭包属性的类中分配了该闭包的功能,就会导致强烈的保留周期。这是我的意思的简单例子 这最终导致了一个保留周期,

  • 我在UIView的底部有一个文本视图,所以当触摸文本视图并且键盘显示时,键盘会阻止文本视图。我该如何解决这个问题?当键盘显示时,我可以让整个UIView向上移动吗?这样键盘就不会阻止任何东西