问题标签 [retain-cycle]

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 投票
1 回答
753 浏览

objective-c - __weak SLComposeViewController 导致 IOS 8 崩溃

我在 IOS 8 中遇到了 SLComposeViewController 的问题。我想显示 Facebook 共享窗口,完成后 - 显示 Twitter 共享窗口。这就是为什么我需要使用完成块并避免保留周期我必须使用__weak SLComposeViewController,但是当我调用

[viewController presentViewController:facebookSLController 动画:YES 完成:Nil];

facebookSLController的为零。这是因为__weak。但为什么它没有在 IOS 7 中崩溃?我该如何解决这个问题?以下是部分代码:

0 投票
1 回答
822 浏览

swift - Swift 内存管理:在 var 中存储 func

我正在寻找将函数作为变量存储在其他对象中的最佳实践。具体来说,我希望避免self在函数中捕获固有的循环。

来自objective-c和blocks,我通常会做这样的事情:

当然,iVar类会复制块并存储它。不存在保留周期,因为我已经捕获__weak id _self.

在 Swift 中,我不太确定,特别是因为我可以传递类函数/方法。所以,让我们在iVar我的课堂上说:

现在在我的“主”类中,我有一个上述类的实例变量,我这样做:

我们这里有保留周期吗?我会这么认为,而且我认为也许我需要让callback弱者:

当然,我可以在主课上做这样的事情:

但是能够将类函数作为参数传递真是太好了!另外,如果我确实需要callback弱化,那么我想我会失去为它分配闭包的能力(因为在分配之后,闭包将从内存中释放,只有一个弱引用)。

另外,请注意内存管理责任的责任现在是由接收者而不是分配者承担,但由于接收者不知道分配的来源,它不能真正负责。换句话说,现在接收者和分配者之间必须有一个关于要传递什么样的函数的隐式契约,这是脆弱的,不推荐使用。当分配者负责时,它可以采取措施确保没有保留周期,但接收者不能采取这样的措施。

这让我认为我们永远不应该将类函数传递给另一个对象。这太危险了。您无法知道接收器将如何存储/使用它。

还是我错过了什么?Swift 是否在幕后神奇地解决了这个问题?

更新

@Kirsteins 指出了我忘记的一些事情:捕获列表。因此weak var _self = self,您可以在闭包中声明它,而不是显式声明:

这更好,但不如简单地分配类函数那么优雅。

我想我想要的是让 Swift 自动将一个类函数转换为一个带有捕获列表的闭包,所以我不必这样做。公平地说,这并不难,但如果我可以分配类函数,那肯定会更漂亮。地狱,即使这样会更好:

0 投票
1 回答
514 浏览

ios - runblock 保留自引用导致内存释放问题

这是我的代码:

经过几天谷歌搜索内存问题,最后我发现我在这个块中有一个自我保留。当我在块运行之前创建新场景时,不会调用 deinit 函数,因为块中的引用。

我必须在我的游戏中这样写,我能做些什么来避免这个问题。你用这样的代码做了什么?

0 投票
2 回答
178 浏览

ios - 目标 C - 因保留周期而丢失

在解雇我的 VC 后,我注意到我并没有从内存中释放所有内容。我对如何找到我的保留周期感到非常迷茫。我正在使用 NSTimer 和 NSNotificationCenter,但我确保在退出之前使和 removeObservers 无效,并确保使用弱委托。

我的保留周期还会发生在哪里?在动画块中?像这样?

使用 GCD 时,我确保使用weakSelf。

谢谢你的帮助。

编辑:

视图将显示

表视图

0 投票
1 回答
1072 浏览

ios - 为什么将“self”放在 GCD 块中会导致内存泄漏?

我已经阅读了 benzado 写的一篇很棒的文章,如果我们有一个类变量保留块本身,并且块保留“自我”,那么使用块将导致内存泄漏,这会导致保留周期。

实现 API 时如何避免在块中捕获自我?

但我不明白为什么使用 GCD 会导致同样的问题?像 dispatch_async() 这样的函数对我来说看起来像是一个不应该被类本身捕获的局部变量?

并且官方文档说我们应该在blocks中加入autorelease,以保证我们的objects被及时释放。

在我的大部分 IOS 项目中,我都像这样使用 GCD:

现在我需要将它们全部更改为

??

它看起来很脏。有谁知道如何以正确的方式做到这一点?

顺便说一句,如果我在块中调用了一些函数并在该函数中使用“self”或“self.delegate”,这是否意味着我需要将所有这些更改为其他内容?(我不知道该怎么做才能解决它)

仅供参考,我的 IOS 项目是在 IOS8.1 和非 ARC环境中构建的。

0 投票
3 回答
155 浏览

objective-c - 从块中调用的方法是否需要使用weakSelf?

如果块内的代码调用了一个方法,如果该方法引用了self,是否存在retain循环?换句话说,一个块下游的所有代码都需要使用weakSelf/strongSelf模式吗?

例如:

. . .

0 投票
2 回答
1729 浏览

ios - @strongify 的原因是什么

ReactiveCocoa中有宏来防止保留循环@weakify和@strongify。根据我的理解@weakify,做一些我通常做的事情,就是__weak为在块中使用创建参考,但是呢@strongify

为什么我需要让它在街区再次变强?

这是一些示例用法:

0 投票
3 回答
316 浏览

ios - 我是否需要一个 strongSelf 来让自己保持活力,strongSelf 真的有效吗?

这是我学到的:使用self保留块时

  1. 我需要一个weakSelf打破保留周期
  2. 我需要一个strongSelf来防止self中途变成零

所以我想测试 a 是否strongSelf真的可以self像这样保持活力:

ViewController 将被推入一个 navigationController 并立即弹出。输出是

样本

为什么是空的?

还有另一个问题,我有一个项目,其中包含大量weakSelf没有的项目,strongSelf并且我收到大量信号 11 崩溃。有关系吗?值得添加strongSelf到它们中吗?

0 投票
1 回答
567 浏览

swift - iOS 数据源和插座参考

我在 Youtube 上查看了一些斯坦福 iOS 开发课程,我发现了一些我不清楚的地方。在讲座中教授解释了如何创建自定义视图和自定义数据源类,代码如下:

FaceView.swift


幸福视图控制器.swift


教授说,必须 将dataSource属性声明为weak属性,以避免视图和视图控制器之间的保留循环。

我的问题是:如果我们将属性声明为强,为什么我们会有一个保留周期dataSource?既然outlet属性是weak,是不是已经避免了保留循环?

0 投票
1 回答
1154 浏览

swift - 在swift中将函数用作块时避免保留循环

以下是您可以在操场上运行的代码示例

它说明了为具有潜在保留周期的块分配值的 3 种方法。案例1.并不2.创建保留周期,因为unowned self如果3.似乎没有办法打破保留周期(deinit从不打印)。如您所见,我什至尝试创建一个本地无主引用。

这是期望的行为,是“设计使然”吗?还是我错过了什么?

谢谢!

从https://devforums.apple.com/message/1122247交叉发布