问题标签 [strong-references]

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 投票
0 回答
143 浏览

ios - UIViewController 循环强引用不会阻止 dealloc

  1. 我正在使用 ARC。
  2. 这里的研究案例包括一个自定义的 UITabBarController 和它的一个 UIViewControllers。
  3. Tabbar 对某个类的 Object 有很强的引用。该对象还具有对 Tabbar 本身的强引用,这导致了导致不调用 dealloc 的循环。
  4. 与 ViewController 相同,它具有对 Object 的强引用,并且对象返回给 viewcontroller。它也没有被释放。但这是因为它的父 uitabbarcontroller 没有被释放。当我从标签栏删除对对象的强引用时,两者都会被释放,而逻辑上应该只分配标签栏,因为视图控制器仍然具有强循环引用。

知道这里发生了什么。我对此进行了大约 2 个小时的调查,但没有任何结果。

为什么 viewcontroller 和 uitabbarcontroller 的行为方式不同?

0 投票
2 回答
875 浏览

swift - 将方法传递给函数时避免强引用

将方法传递给采用闭包的函数时,我可以使用someFunc(closure: someMethod) orsomeFunc() { [unowned self] in self.someMethod() }`。

第一个较短,但提供了强有力的参考。如何在避免这种强引用的同时使用它?

这是一个既有泄漏的演示也有好的演示: https ://swiftlang.ng.bluemix.net/#/repl/581ccd3a0bdc661a6c566347

较短的选择在第 26 行,如果我替换doNothing{ [unowned self] notif in self.doNothing(notif) },则强引用消失了。

有任何想法吗?

0 投票
0 回答
159 浏览

ios - 无法使用仪器找到对对象的强引用 - XCode 8

假设我有根视图控制器 A。然后我推送视图控制器 B。但是在 pop B 之后,它没有被释放(使用 dealloc 方法检查,它没有被 popViewController 调用。如果我错了,请纠正我)。我为此做了很多搜索,并得出结论,最可能的原因是“对视图控制器持有的对象的强引用”。

我已经尝试使用仪器的分配工具,使用可用的教程来找出为什么我的视图控制器在 popViewController 之后没有被释放,或者是否有任何对对象的强引用。

以下是我在仪器中得到的结果:

在此处输入图像描述

如上面的屏幕截图所示,显示的行数我没有得到。

我的问题是:

  1. 如何检测导致视图控制器在 popViewController 后未释放的原因

  2. 如果第一个问题的答案是“对该视图控制器持有的对象的强引用”。它到底是什么以及如何检测它?

更新 :

以下是从登录屏幕导航到仪表板的代码

登录VC.h

登录VC.m

仪表板.h

仪表板.m

谢谢 !

0 投票
3 回答
210 浏览

swift - 对字典中子视图的强引用会导致引用循环吗?

我有一个带有可变子视图的视图,子视图是使用描述此子视图类型的枚举设置的。我的问题是以下是否会导致强大的参考周期,或者是否有更好的方法来做到这一点:

我不能将字典声明为弱。因此,超级视图将引用子视图层次结构中的每个 ControlBarItem 以及按类型索引的字典。我这样做的原因是有时我需要从充当 ControlBar 委托的 viewController 更改 BarItem 的状态。

0 投票
1 回答
754 浏览

ios - 具有强引用的视图控制器导致内存泄漏

我的一个视图控制器中存在强引用问题,导致内存泄漏。首先,我的设置:

2 个视图控制器(v1 和 v2)。v1 连接到 v2,v2 有一个关闭按钮,可以将自身弹回 v1。v2 包含尝试无限重新连接直到建立连接的代码。(使用 red5pro 的视频流)。这是代码:

在我的情况下,连续重新连接是可取的,但是当用户退出 v2 时,我希望重新连接停止。但是目前,即使用户离开了 v2,重新连接也会无限进行。

我开始知道这是因为 v2 具有强大的引用,并且即使在用户退出它之后也会继续存在。所以这导致无限调用 reconnect() 方法的代码继续运行。我将尝试清理 v2 以将所有内容转换为弱引用,但我也在考虑一些替代方案,对此我有几个问题:

  1. 有没有办法杀死 viewDidDisappear 或其他东西的重新连接,所以即使我的视图控制器没有被破坏,至少我的重新连接过程会停止?

  2. 从 v2 退出回到 v1 后,如果用户再次转到 v2,是否可以分配相同的 v2 实例而不是每次都创建一个新实例?

0 投票
1 回答
608 浏览

ios - 将强引用转换为对自身的弱引用

您如何将其转换为对 self 的弱引用?

另外,一个相关的问题——视图控制器何时真正被销毁?我假设当您在不同的视图中切换时,视图控制器仍然存在,对吧?即它们不会在viewDidDisappear 上被破坏。

0 投票
1 回答
977 浏览

java - 弱引用、强引用和垃圾回收

我有两种情况:

  1. 当一个对象(只有强引用)丢失所有强引用时,它就可以用于垃圾回收了。
  2. 当对象只有弱引用时,它也可用于垃圾回收。

在什么情况下会更快地收集对象?还是没有区别?

我正在开发旧的 android 应用程序。我的前任使用弱引用(作为实例变量)将视图存储在 RecyclerView 适配器的持有者中。我想知道他为什么这样做。我有一个想法,可以通过弱引用强制GC来收集对象。我的意思是,在下一次垃圾收集中,只有对 100% 的弱引用的对象将被收集,而没有引用的对象可能不会被收集。可以这样吗?

0 投票
0 回答
183 浏览

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

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

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

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

在此处输入图像描述

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

更新

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

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

0 投票
2 回答
378 浏览

ios - 查找强引用循环的原因

我在查找视图控制器未发布的原因时遇到了一些麻烦。它只出现在层次结构的顶部,因为它是一个子页面,唯一的目的是与应用程序的其他用户聊天(一个次要功能)。

我已经尝试过使用仪器,我能找到的唯一信息是保留的原因是 UIKit - UIClassSwapper 的一个计数,这对我来说没有多大意义。

在此处输入图像描述

我在控制器中使用以下内容:

  1. Realm - 本地存储聊天记录
  2. Socket IO - 实时发送和接收消息
  3. UITableView+delegate - 显示消息
  4. UITextView+delegate - 输入消息
  5. NotificationCenter - 当键盘出现/消失和应用程序进入背景/前景时的行为

没有使用自定义委托,并且在此控制器中使用了对 self 的显式强引用。聊天气泡具有自定义绘图代码,可添加图层但不需要任何其他视图的引用。

什么可能导致视图控制器被保留?

这很重要,因为保留的每个视图控制器都会导致套接字响应服务器发送的事件。让每个用户在一段时间后计为多个。

请务必提及代码的任何特定部分是否更有可能导致此问题,我会将其添加到我的问题中。整个视图控制器有 400 多行代码,在我的问题中完全包含它是不切实际的。

编辑

我采纳了inokey的建议,分解了各个部分进行调试,导致retain cycle的原因其实是Socket IO。我还重新阅读了 Socket IO 的文档,发现有一种removeAllHandlers()方法可以删除所有可能导致强引用循环的引用。

最后,我没有仔细阅读文档是我的错误-.-

0 投票
2 回答
2883 浏览

ios - NSMapTable 是如何工作的

我试图弄清楚 NSMapTable 是如何工作的所以我在操场上尝试以下代码:

如文档中所写:“键和/或值可以选择“弱”保存,以便在回收对象之一时删除条目。”

为什么即使我初始化了对象,以便在解除分配 rob 时它对键值对具有弱引用,但在 hobyePerson 中仍然有一个元素?