问题标签 [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 投票
2 回答
81 浏览

ios - 为什么保留代表是错误的所有替代方案是什么...?

我有一个问题,假设 A 和 B 是从 A 用户推送到 B 视图控制器的 2 个视图控制器,在 B 中,用户通过创建对象 C(这是 NSObject 类)开始一些下载并将 B 设置为 C(分配)的委托,现在用户想回到A然后B的dealloc调用对象释放,C委托无法回叫(崩溃)。我想得到调用并允许用户移动到其他视图控制器,这样我就可以在C类中保留委托但是保留代表是错误的......

提前致谢。

0 投票
0 回答
164 浏览

ios - 为什么 ivar 即使在 ivar 被取消后仍保留一个块?

我们有这样的结构(ARC 代码):

问题是对象永远不会释放,因为 self 永远不会完全释放。如果我将 self 替换为 weakSelf 版本,则该对象将成功解除分配。

有没有办法将 ivar 归零,以便释放它“持有”的块并且可以释放对象?

0 投票
2 回答
917 浏览

ios - 如何解决 void* 的块中保留循环?

我有一个链接在我的 iOS 应用程序中的 C++ 静态库。我有一个 void* 以便从我的代码中访问库提供的一些操作。问题是我已经在我的项目中激活了 ARC,它尖叫着在一个称为 void* 的块中生成了一个保留周期。

生成保留周期警告的代码如下所示:

当我将 libInstance 指针作为参数传递给函数时,它会发出如下警告:

在此块中强烈捕获“自我”可能会导致保留周期

如果我尝试做这样的事情:

它给出如下警告:

这很清楚..问题是我如何克服这个保留周期?任何指针?

0 投票
1 回答
3190 浏览

objective-c - 块,自我,保留周期

我在一个块内引用 self 而不是创建保留周期时遇到了一些麻烦。

您能否告诉我我的理解是否正确:

如果我曾经在块内引用 self ,它将创建一个保留循环,相反我应该在块外创建对 self 的弱引用,然后在块内使用该弱引用?

谢谢!

0 投票
2 回答
456 浏览

objective-c - 在块保留周期中调用函数

如果我从块内部调用的函数引用“self”,那会创建一个保留循环吗?

我在'secondFunction'中调用'self',我需要将我的弱指针传递给这个函数并使用它吗?

0 投票
1 回答
263 浏览

objective-c - 以编程方式检测对象层次结构中的保留周期的策略可能是什么?

我正在编写一个支持 ARC 的框架,它创建对象层次结构,与 Cocoa 的视图层次结构不同。每个控制器对象可以有多个子控制器。控制器可能相互引用,这会带来创建保留周期的潜在风险。

我知道如何避免保留周期。我想知道是否有办法以编程方式检测存在保留周期并防止对象释放?

在某个时候,现有的根控制器将被新的根控制器取代。由于我使用的是 ARC,因此无法使用 retainCount 检查现有控制器的保留计数。从我读过的内容来看,无论如何都不值得信任。

我有一个测试设置,其中根控制器有两个子控制器,每个子控制器都对另一个有很强的引用。在这种情况下,根控制器不会运行 dealloc,当根控制器被新控制器替换时,其他两个控制器也不会运行。正如预期的那样。我在想,在这种情况下,我应该有某种方法来确定该根控制器是否确实解除分配。

可能的解决方案:在替换控制器之前不久,我确实将要替换的根控制器分配给全局对象上的归零弱属性。然后我设置了一个计时器,以便在几分之一秒后检查该属性是否为零。如果它为零,则控制器确实解除了分配。如果它不是 nil,它可能表示内存泄漏可能是由层次结构中某处的保留周期引起的。在这种情况下,只要替换的控制器不为零,我就会打印一条日志语句以引起开发人员的注意。

这行得通,但是有没有其他(更好的)解决方案?或者这个解决方案可能需要注意什么?

具体来说,在对象解除分配之前可以经过多长时间 - 这是否保证是瞬时的,或者可以延迟解除分配,如果可以,持续多长时间?

0 投票
3 回答
8971 浏览

objective-c - ARC中的保留周期

我从未从事过非基于 ARC 的项目。我刚刚在基于 ARC 的项目中遇到了一个僵尸。我发现这是因为保留周期。我只是想知道什么是保留周期。可以

你能给我一个保留周期的例子吗?

0 投票
1 回答
1357 浏览

objective-c - 使用 ARC、NSOperationQueue 和 dispatch_source_t(定时器)保持循环

我有一个向串行 NSOperationQueue 添加操作的方法。由于我想定期调用该方法,因此我使用调度源计时器。

但是,也可以响应用户操作调用此方法。当这种情况发生时(例如,由于计时器调用方法之前的片刻),我会延长计时器的触发日期。

问题是我写的代码有一个保留周期,我不明白在哪里。

这是演示问题的简化示例(不要忘记将部署 SDK 设置为 10.7):

0 投票
1 回答
148 浏览

objective-c - 没有“可能导致保留周期”警告是否意味着不会创建强引用周期?

根据过渡到 ARC 发行说明,当在块中引用 self 时,应使用弱引用以避免强引用/保留循环:

有时,我会收到一个编译器警告,指出在块中引用 self 可能会导致保留循环。没有警告是否意味着不会创建保留周期?为什么警告被限定为“可能”导致保留周期?

0 投票
3 回答
466 浏览

ios - 阻塞和保留循环无法捕获它


我遇到了块和弱引用的问题,我在 ARC 下。我建立了一个类,它是一个免费项目,它是一种围绕 Google Directions API 的简单包装器,您可以在此处下载它:链接到该项目
我在视图控制器中使用它问题是使用它后视图控制器是未解除分配。我想这是这个对象的一个​​问题,因为如果我将它注释掉或设置为 nil 一切正常。我无法理解保留周期在哪里,当然我设置为弱自我,这是我使用它的视图控制器的方法:

如果我放置断点并询问视图控制器的 retainCount,我可以看到即使传递的视图控制器设置为弱,它也会增加不同的时间。任何帮助将不胜感激。
谢谢,
安德里亚

/ * ** * ** * ** * ** UPDATE * ** * ** * ** * * /**
检查分配我可以看到在块内视图控制器被保留了很多次通过 trought调用-tryRetainuntil 的方法被递减,但它似乎错过了一个释放释放。为了清楚起见,我必须指定传递的块被复制到类路由方向对象中。我做了一个小样本,你可以在这里下载:下载项目