问题标签 [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.
c# - 为什么 .NET 没有像 Java 那样的 SoftReference 和 WeakReference?
我真的很喜欢 WeakReference 的。但我希望有一种方法可以告诉 CLR 多少(例如,在 1 到 5 的范围内)您认为该引用有多弱。那将是辉煌的。
Java 有 SoftReference、WeakReference,我相信还有第三种类型,称为“幻像引用”。那是 3 个级别,GC 在决定该对象是否获得印章时具有不同的行为算法。
我正在考虑将.NET 的 WeakReference 子类化(幸运的是,它没有被密封)来制作一个基于过期计时器或其他东西的伪 SoftReference。
c# - .NET 中是否存在弱引用?
我想在我的应用程序中保留某类对象的列表。但我仍然希望对象被垃圾收集。您可以在 .NET 中创建弱引用吗?
以供参考:
来自 MSDN 的回答:
要与对象建立弱引用,请使用要跟踪的对象的实例创建 WeakReference。然后将 Target 属性设置为该对象并将该对象设置为 null。有关代码示例,请参阅类库中的 WeakReference。
objective-c - Objective C 中的实例缓存
我想缓存某个类的实例。该类保留其所有实例的字典,当有人请求新实例时,该类首先尝试满足来自缓存的请求。但是内存管理有一个小问题:字典缓存保留了插入的对象,因此它们永远不会被释放。我确实希望它们被解除分配,因此我不得不重载该release
方法,并且当保留计数降至 1 时,我可以从缓存中删除实例并让它被解除分配。
这行得通,但我不喜欢乱搞该release
方法并发现解决方案过于复杂。我想我可以使用一些不保留它存储的对象的散列类。有这样的吗?这个想法是,当某个实例的最后一个用户释放它时,该实例将自动从缓存中消失。
NSHashTable似乎是我正在寻找的东西,但文档谈到“在垃圾收集环境中支持弱关系”。没有垃圾收集它也能工作吗?
澄清:除非有人真的需要它们,否则我无法将实例保存在内存中,这就是为什么我想在最后一个“真实”用户释放实例时从缓存中清除实例。
更好的解决方案:这是在 iPhone 上,我想缓存一些纹理,另一方面,我想在最后一个真正的持有者释放它们时立即从内存中释放它们。更简单的编码方法是通过另一个类(我们称之为TextureManager
)。此类管理纹理实例并缓存它们,以便从缓存中提供对具有相同名称的纹理的后续调用。当最后一个用户释放纹理时,无需立即清除缓存。我们可以简单地将纹理缓存在内存中,当设备内存不足时,我们会收到内存不足警告并可以清除缓存。这是一个更好的解决方案,因为缓存的东西不会污染Texture
类,我们不必搞砸,release
缓存命中的机会甚至更高。这TextureManager
可以抽象成一个ResourceManager
,这样它就可以缓存其他数据,而不仅仅是纹理。
c++ - 如何定义地址为空的对象?
我想知道如何在 C 中定义一个引用为空的对象?
我可以找到一些方法来做到这一点,但没有一个适合我的需要。
实际上,我更喜欢符合标准的解决方案(c99),但任何工作都可以。
编辑:这样做的原因是 bar 并不总是为空。这是一个更相关的例子:
当然,这仍然不是很相关,因为我可以在我的情况下使用#if。该项目实际上涉及大型结构、大量文件、一些编译器、一些 cpu 目标以及许多程序员,这些程序员产生的错误的概率与他们使用的语法的复杂性成指数级。这就是为什么我想要一个简单的宏来声明我的 foo 对象。
.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实例。
python - 为什么weakref 不适用于这种绑定方法?
我有一个项目,我试图在回调中使用弱引用,但我不明白我做错了什么。我创建了简化的测试,显示了我感到困惑的确切行为。
为什么在这个测试中 test_a 按预期工作,但是 self.MyCallbackB 的弱引用在类初始化和调用 test_b 之间消失了?我想只要实例 (a) 存在,对 self.MyCallbackB 的引用就应该存在,但它不存在。
.net - 相当于.net中的SoftReference?
我熟悉WeakReference
,但我正在寻找一种仅在内存不足时才清除的引用类型,而不仅仅是每次 gc 运行时(就像 Java 一样SoftReference
)。我正在寻找一种实现内存敏感缓存的方法。
python - python中的弱引用列表
我需要一个弱引用列表,当它们死亡时删除它们。目前我这样做的唯一方法是继续刷新列表(手动删除死引用)。
我知道有一个 WeakKeyDictionary 和一个 WeakValueDictionary,但我真的很喜欢 WeakList,有没有办法做到这一点?
这是一个例子:
c# - 这个缓存功能是否像我认为的那样工作?
我暂时写了这个方法:
所以有点背景:
我有一些冗长的遗留方法,看起来有点像这样:
我可能的解决方案是这样做:
我对此的看法:
- 超出这个方法调用的范围我不需要缓存,所以只要方法一返回GC就收集就好了
- 如果代码采用不需要加载数据的路径,则不会发生命中
- 如果它确实需要数据,如果再次需要,它将被缓存在弱引用中。
- 如果 GC 确实在中途收集,则无关紧要,因为它只会重新加载。
我的问题:
- 这真的会奏效吗?- 我在
WeakCacheFor
方法中是否遗漏了任何可能导致无意中被强烈引用的内容? - 我是不是为了自己的利益太聪明了?- 即使不需要,我是否应该只招致命中并将数据缓存在普通的局部变量中?
我怀疑我可能太聪明了,但即使我是,这在其他人看来是否像一个可以在其他情况下有用的解决方案?
更新:修改功能,因为显然你不能信任 .IsAlive
更新:我意识到返回的Func
将在方法结束时超出范围,所以我根本不需要弱引用,普通的引用就可以了。我认为我正遭受“只见树木不见森林”的情况。
objective-c - Objective-C 中的弱键字典
我想知道是否有可能在 Objective-C 中拥有类似于 ActionScript 3 的Dictionary
带有弱键的对象。我希望能够将一个类的实例“附加”到其他任意实例。
例子;
然后:
棘手的部分是,在被释放someObject
引用的对象之后,我希望meta
释放引用的对象(并且释放,假设没有客户端代码保留它)。
可能的?我看了看,+[NSValue valueWithNonretainedObject:]
但我不确定这是否是我想要的,因为当我稍后查询时,我-[NSValue nonretainedObjectValue]
似乎会得到一个指向垃圾的指针(当对象被释放时,NSValue 如何将指针归零?)。
谢谢,
本杰明
2011 年 9 月 23 日更新:我相信这样做的方法是使用objc_setAssociatedObject
相关功能。请参阅Objective-C 运行时参考。