问题标签 [weak-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 投票
9 回答
5143 浏览

c# - 为什么 .NET 没有像 Java 那样的 SoftReference 和 WeakReference?

我真的很喜欢 WeakReference 的。但我希望有一种方法可以告诉 CLR 多少(例如,在 1 到 5 的范围内)您认为该引用有多弱。那将是辉煌的。

Java 有 SoftReference、WeakReference,我相信还有第三种类型,称为“幻像引用”。那是 3 个级别,GC 在决定该对象是否获得印章时具有不同的行为算法。

我正在考虑将.NET 的 WeakReference 子类化(幸运的是,它没有被密封)来制作一个基于过期计时器或其他东西的伪 SoftReference。

0 投票
4 回答
2988 浏览

c# - .NET 中是否存在弱引用?

我想在我的应用程序中保留某类对象的列表。但我仍然希望对象被垃圾收集。您可以在 .NET 中创建弱引用吗?

以供参考:

来自 MSDN 的回答:

要与对象建立弱引用,请使用要跟踪的对象的实例创建 WeakReference。然后将 Target 属性设置为该对象并将该对象设置为 null。有关代码示例,请参阅类库中的 WeakReference。

0 投票
6 回答
3734 浏览

objective-c - Objective C 中的实例缓存

我想缓存某个类的实例。该类保留其所有实例的字典,当有人请求新实例时,该类首先尝试满足来自缓存的请求。但是内存管理有一个小问题:字典缓存保留了插入的对象,因此它们永远不会被释放。我确实希望它们被解除分配,因此我不得不重载该release方法,并且当保留计数降至 1 时,我可以从缓存中删除实例并让它被解除分配。

这行得通,但我不喜欢乱搞该release方法并发现解决方案过于复杂。我想我可以使用一些不保留它存储的对象的散列类。有这样的吗?这个想法是,当某个实例的最后一个用户释放它时,该实例将自动从缓存中消失。

NSHashTable似乎是我正在寻找的东西,但文档谈到“在垃圾收集环境中支持弱关系”。没有垃圾收集它也能工作吗?


澄清:除非有人真的需要它们,否则我无法将实例保存在内存中,这就是为什么我想在最后一个“真实”用户释放实例时从缓存中清除实例。


更好的解决方案:这是在 iPhone 上,我想缓存一些纹理,另一方面,我想在最后一个真正的持有者释放它们时立即从内存中释放它们。更简单的编码方法是通过另一个类(我们称之为TextureManager)。此类管理纹理实例并缓存它们,以便从缓存中提供对具有相同名称的纹理的后续调用。当最后一个用户释放纹理时,无需立即清除缓存。我们可以简单地将纹理缓存在内存中,当设备内存不足时,我们会收到内存不足警告并可以清除缓存。这是一个更好的解决方案,因为缓存的东西不会污染Texture类,我们不必搞砸,release缓存命中的机会甚至更高。这TextureManager可以抽象成一个ResourceManager,这样它就可以缓存其他数据,而不仅仅是纹理。

0 投票
11 回答
844 浏览

c++ - 如何定义地址为空的对象?

我想知道如何在 C 中定义一个引用为空的对象?

我可以找到一些方法来做到这一点,但没有一个适合我的需要。

实际上,我更喜欢符合标准的解决方案(c99),但任何工作都可以。


编辑:这样做的原因是 bar 并不总是为空。这是一个更相关的例子:

当然,这仍然不是很相关,因为我可以在我的情况下使用#if。该项目实际上涉及大型结构、大量文件、一些编译器、一些 cpu 目标以及许多程序员,这些程序员产生的错误的概率与他们使用的语法的复杂性成指数级。这就是为什么我想要一个简单的宏来声明我的 foo 对象。

0 投票
3 回答
1048 浏览

.net - Lambda 表达式导致弱引用的目标不能是 GC?

为什么 GC 后 w2.Target 不为空?

编辑

感谢所有的答案,Brian Rasmussen 和 Jon Skeet 你的答案是正确的。现在我彻底明白了这是怎么回事,所以我又写了一个例子来让一切更清楚。

以下示例表明:

如果 Test#create() 没有引用任何实例属性或方法,那么编译器将创建“private static HandleMessage CS$<>9__CachedAnonymousMethodDelegate1”,就像 Jon Skeet 所说的那样 - 当你使用相同的lambda 表达式多次。

如果 Test#create() 确实引用了实例属性或方法,如下例调用 this.ToString(); 那么编译器无法创建静态方法来替换实例方法的逻辑,所以在GC之后可以收集HandleMessage实例。

0 投票
3 回答
2690 浏览

python - 为什么weakref 不适用于这种绑定方法?

我有一个项目,我试图在回调中使用弱引用,但我不明白我做错了什么。我创建了简化的测试,显示了我感到困惑的确切行为。

为什么在这个测试中 test_a 按预期工作,但是 self.MyCallbackB 的弱引用在类初始化和调用 test_b 之间消失了?我想只要实例 (a) 存在,对 self.MyCallbackB 的引用就应该存在,但它不存在。

0 投票
5 回答
1532 浏览

.net - 相当于.net中的SoftReference?

我熟悉WeakReference,但我正在寻找一种在内存不足时才清除的引用类型,而不仅仅是每次 gc 运行时(就像 Java 一样SoftReference)。我正在寻找一种实现内存敏感缓存的方法。

0 投票
6 回答
9101 浏览

python - python中的弱引用列表

我需要一个弱引用列表,当它们死亡时删除它们。目前我这样做的唯一方法是继续刷新列表(手动删除死引用)。

我知道有一个 WeakKeyDictionary 和一个 WeakValueDictionary,但我真的很喜欢 WeakList,有没有办法做到这一点?

这是一个例子:

0 投票
2 回答
272 浏览

c# - 这个缓存功能是否像我认为的那样工作?

我暂时写了这个方法:

所以有点背景:

我有一些冗长的遗留方法,看起来有点像这样:

我可能的解决方案是这样做:

我对此的看法:

  • 超出这个方法调用的范围我不需要缓存,所以只要方法一返回GC就收集就好了
  • 如果代码采用不需要加载数据的路径,则不会发生命中
  • 如果它确实需要数据,如果再次需要,它将被缓存在弱引用中。
  • 如果 GC 确实在中途收集,则无关紧要,因为它只会重新加载。

我的问题:

  1. 这真的会奏效吗?- 我在WeakCacheFor方法中是否遗漏了任何可能导致无意中被强烈引用的内容?
  2. 我是不是为了自己的利益太聪明了?- 即使不需要,我是否应该只招致命中并将数据缓存在普通的局部变量中?

我怀疑我可能太聪明了,但即使我是,这在其他人看来是否像一个可以在其他情况下有用的解决方案?

更新:修改功能,因为显然你不能信任 .IsAlive

更新:我意识到返回的Func将在方法结束时超出范围,所以我根本不需要弱引用,普通的引用就可以了。我认为我正遭受“只见树木不见森林”的情况。

0 投票
2 回答
2449 浏览

objective-c - Objective-C 中的弱键字典

我想知道是否有可能在 Objective-C 中拥有类似于 ActionScript 3 的Dictionary带有弱键的对象。我希望能够将一个类的实例“附加”到其他任意实例。

例子;

然后:

棘手的部分是,在被释放someObject引用的对象之后,我希望meta释放引用的对象(并且释放,假设没有客户端代码保留它)。

可能的?我看了看,+[NSValue valueWithNonretainedObject:]但我不确定这是否是我想要的,因为当我稍后查询时,我-[NSValue nonretainedObjectValue]似乎会得到一个指向垃圾的指针(当对象被释放时,NSValue 如何将指针归零?)。

谢谢,

本杰明

2011 年 9 月 23 日更新:我相信这样做的方法是使用objc_setAssociatedObject相关功能。请参阅Objective-C 运行时参考