问题标签 [capture-list]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5572 浏览

swift - 在嵌套函数中自我捕获

对于闭包,我通常会附加[weak self]到我的捕获列表中,然后对自身进行空检查:

self如果我使用嵌套函数代替闭包,我如何执行空检查(或者检查是否必要......或者使用这样的嵌套函数是否是一种好习惯),即

0 投票
1 回答
776 浏览

methods - 如何从方法的闭包中删除强引用循环?

这里我有一些关闭强引用循环的例子。如果我将一个闭包分配给一个存储的属性,我可以使用一个闭包捕获列表来使捕获的引用无主/弱。但是,如果我将方法分配给存储的属性闭包或将方法分配给外部范围内的闭包,我将无法使用捕获列表。

在最后两种情况下,我该怎么做才能删除参考循环?

使用仅闭包的捕获列表创建和避免强引用循环的示例

使用方法闭包创建强引用循环的示例

通过从外部方法设置闭包来创建强引用循环的示例

输出

测试“强烈引用自我的闭包”:

正在取消初始化具有属性“ClosureClass 的默认值”的对象

测试“使用方法实习生设置闭包”:

测试“使用外部方法设置闭包”:

0 投票
1 回答
1758 浏览

swift - Swift XCTest:验证弱变量的正确释放

最近,我试图验证我编写的对象是否使用单元测试正确解除分配。然而,我发现无论我尝试什么,对象都不会在测试完成之前解除分配。所以我将测试简化为一个简单的例子(见下文),它试图证明使用弱变量的对象释放的基础知识。

在我看来,在测试方法退出后,强引用应该停止保留对象,而在下一个运行循环中引用时,弱引用应该为零。但是,弱引用永远不会为零,并且两个测试都失败了。我在这里误解了什么吗?以下是完整的单元测试。

我认为 XCTest 可能会以某种方式推迟释放,但即使将测试方法体包装在 anautoreleasepool中也不会导致对象释放。

0 投票
0 回答
183 浏览

ios - 即使在定义捕获列表时,GCD 也会强烈引用“自我”

运行上述代码时,即使 MyViewController 从导航堆栈弹出或被解除,MyClass 也永远不会被释放。

但是,如果我将 MyClass 的实现直接移动到 MyViewController,一切都会按预期进行:

我使用 Debug Memory Graph 来找出仍然保留对 MyClass 实例的引用,这就是我得到的:

在此处输入图像描述

为什么还有参考?我在这里想念什么?

更新

因此,我试图弄清楚为什么它可以与 MyViewController 一起使用,但在两者之间有另一个实例时却不行。似乎从 NSObject 继承有所不同。当我从 NSObject 继承 MyClass 时,会调用 deinit 并且一旦完成长操作,self 就会正确设置为 nil。

现在的问题是,Swift 中的捕获列表与 NSObject 有什么关系?

0 投票
2 回答
493 浏览

swift - 如何在 Swift 3 中使用 DispatchQueue.main.async/Block/Closures 更新数据模型

我正在学习斯威夫特。我有一个问题。

问题- 我有带有图像 url 的 DataModel,所以第一次会从 url 下载图像,当然第二次不会。因此,当我在我的块中获取图像时,我想用图像更新我的数据模型。但它不起作用。

  • 我试过 inout 功能
  • 还有completionHander回调

ViewController.swift

细胞.斯威夫特

0 投票
1 回答
47 浏览

lambda - 通过延长捕获寿命来保留指针

是否可以unique_ptr通过在 lambda 中捕获它并延长 lambda 的寿命来延长 a 的寿命?

我试过了,但a=move(a)表达式出现语法错误。

0 投票
0 回答
497 浏览

swift - 我怎样才能找到所有的闭包?

在闭包中引用 self 时,我们完全忘记了捕获 self 及其属性。(注意:编译器没有警告我们。)现在我们的应用程序充满了强引用循环。要修复它们,我们必须将捕获列表逐个添加到每个闭包中。

我们怎样才能找到它们?我想搜索,in但它导致太多结果,包括评论,周期。

好的旧目标 C 将帮助我搜索^. 它会警告我们...

0 投票
0 回答
212 浏览

swift - 在创建闭包并存储它时保持对对象的引用

我有一个关于在特定示例中的闭包中如何处理对对象的引用的问题。下面的代码被简化以展示这个想法

所以我们这里有一个类SomeObject,它可以存储一个闭包数组,当其变量的值发生变化时将执行这些闭包。TestClass创建一些这样的对象,然后从这些对象中创建数组,并为这个数组中的每个对象添加一个闭包,该闭包将执行一个函数,TestClass当任何这些对象的值SomeObjects发生变化时。

好的,现在在这个可以由任何创建的对象触发的函数中,我想确定我知道哪个对象实际上导致它执行。引用在函数执行中传递,但请注意,object这里是从循环中获取并传递给闭包(闭包将执行 valueOfObjectChanged 并将对象引用作为参数传递)。

那有什么问题 - 我不确定对对象的引用是否真的会保留给正确的对象,因为这个闭包在与创建闭包时完全不同的地方执行。

我不能把object这个关闭capture list,因为这会导致Segmentation fault: 11

我不确定在这种情况下闭包会如何表现 - 会保留对对象的引用,还是会出错?

我也可以在定义中添加调用者valueObservers,但由于应用程序的当前结构,这是我想避免的(示例只是一个简化)。

所以我的问题是 - 对objectunder的引用是否object.valueObservers.append总是正确的,并且指向改变了它的值的对象,或者它是否不正确,例如指向最后一个被迭代的对象,objects.forEach甚至是其他东西?

0 投票
1 回答
673 浏览

swift - Swift - @escaping 和捕获列表澄清

我试图尽可能多地研究这个主题,但我仍然有一些事情没有在我的脑海中解决,我会很感激能得到关于它们的澄清..所以我提出了一些问题..

  1. 编译器如何知道我必须在后台线程上添加@escaping,然后强迫我使用它?
  2. 使用@escaping 是否需要付费?如果没有.. 为什么不总是标记?如果我用@escaping 标记关闭,即使我真的不需要它,会出现什么问题?当我试图这样做时..我的代码没有问题,无论有没有@escaping,结果都保持不变。
  3. 使用捕获列表 [weak self] [unowned self] 的成本是多少?我知道它会复制该对象,所以我想暂时它会占用更多内存,但在使用结束时,该副本将从内存中删除..那么,使用它有更多缺点吗?
0 投票
3 回答
423 浏览

swift - Swift - 捕获列表自我澄清

在阅读了一些苹果的文章和开发者指南之后,我仍然对关闭捕获列表感到困惑。“捕获”是什么意思,在无主自我和弱自我方面如何在幕后工作?闭包如何在不拥有对象的情况下使用 self?我认为它就像制作该对象的副本,所以当它完成时,它会像值类型一样从堆栈传递,但我想我错了。我希望这里的某人可以使它更容易理解,或者将我链接到回答这个特定问题的好文章。感谢提前