当前位置: 首页 > 知识库问答 >
问题:

当self在转义闭包内较弱时,调用self函数中的self参数

牟正真
2023-03-14

晚上好。

我对Swift中的转义(异步)闭包持怀疑态度,我想知道解决它的最佳方法是什么。

有一个示例函数。

func exampleFunction() {
   functionWithEscapingClosure(onSuccess: { result in
      self.anotherFunction(parameter: self.parameter, result: result)
   }
}

正如您可能已经注意到的,这将导致内存泄漏,因为on成功是一个转义闭包,它保持自我。

现在,解决的办法就是在闭包里加入【弱自我】。我希望另一个函数只有在self不为0时才会被调用,所以应该是这样的:

func exampleFunction() {
   functionWithEscapingClosure(onSuccess: { [weak self] result in
      self?.anotherFunction(parameter: self.parameter, result: result)
   }
}

但是参数是个问题,因为我不能传递nil参数,所以我必须打开自己才能使用该参数。

使用强制展开(self!.parameter)是否安全,因为只有self不是nil时才会调用该函数?我应该为<code>self>执行变量绑定吗?。调用<code>self?之前的参数?。另一个函数?

提前感谢!

共有2个答案

边明煦
2023-03-14

让我们在您的捕获列表之后使用此选项

guard let `self` = self else { return }

你的功能应该是这样的:

func exampleFunction() {
   functionWithEscapingClosure(onSuccess: { [weak self] result in
      guard let `self` = self else { return }
      self.anotherFunction(parameter: self.parameter, result: result)
   }
}

所以,不要再担心可选(?)了。

齐献
2023-03-14

是的,你会写

self?.anotherFunction(parameter: self!.parameter, result: result)

如果selfnil,则根本不调用该函数。

 类似资料:
  • 最常用的BIF之一,返回调用进程的pid。 语法 (Syntax) self() 参数 (Parameters) 没有 返回值 (Return Value) 返回调用进程的pid。 例如 (For example) -module(helloworld). -export([start/0]). start() -> io:fwrite("~p~n",[self()]). 输出 (

  • 在 Swift 3 中,dispatch_once函数被删除,迁移指南建议使用初始化闭包: 让myGlobal = { … global包含对闭包调用的初始化…}() _ = myGlobal //使用myGlobal只会在首次使用时调用初始化代码。 我想从初始化闭包中访问“Self”实例变量,如下所示: 为什么“自我”在闭包中是不可接近的,如何才能使它成为现实?

  • 在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数。例如,定义一个 Person 类: 那么,self 到底扮演着什么样的角色呢?本节就对 self 参数做详细的介绍。 事实上,Python 只是规定,无论是构造方法还是实例方法,最少要包含一个参数,并没有规定该参数的具体名称。之所以将其命名为 self,只是程序员之间约定俗成的一种习

  • 问题内容: 在子类中重写方法时,我经常这样做: 我的问题是:super(type(self),self)是否有捷径? 问题答案: 不要那样做:如果仅可以将其用作第一个参数,那么就不必将它放在第一位。您必须在此处传递实际的类,而不是如果该类已被子类化的表达式可能会更改的表达式。 super的第一个参数必须是包含当前方法定义的类,因为您要告诉super在基础列表中从哪里开始搜索。 Python 3知道

  • 问题内容: 我希望能够从Nib中提取UIView子类的实例。 我希望能够调用MyCustomView.instantiateFromNib()并具有MyCustomView的实例。我几乎已经准备好通过桥接头文件来移植我拥有的工作中的Objective- C代码,但是我想我会首先尝试惯用的方法。那是两个小时前。 现在是错误的,因为“’是’之后的预期类型”。在那之后我尝试过的内容显示了很多我对Swif

  • 主要内容:语法,示例SQL SELF JOIN 用于将一个表和自身连接,就好像存在两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。 自连接通常用于将表的某个字段与该表的同一字段的其它值进行比较。 语法 SELF JOIN 的基本语法如下: 您看,SQL 并没有 SELF JOIN 关键字,而是使用 WHERE 子句来达到自连接的目的。 示例 自连接的语法比较简单,但是结果往往不是那么容易理解,让我