如何判断一个对象是不是被释放掉 C#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断一个对象是不是被释放掉 C#相关的知识,希望对你有一定的参考价值。

个人认为无法判断,除非你是用了IDispose接口显示释放掉的从而设置类的属性IsDisposed为true,或者在析构函数中有设置一个类似于IsDisposed的属性值来供外界参考。
原因是,只有没有被任何变量引用的对象会被GC回收掉。正是因为这种机制,当一个对象满足回收条件时,程序员无法跟踪这个实际对象,而且即使你知道有这么个对象,也无法再程序中表示,因为它不被任何变量引用,孤独的占着堆上的一块内存等待被回收。

个人观点
参考技术A 可以判断它是否为null。 参考技术B OBJECT.IsDisposed

Objective-C 有没有办法判断一个对象是不是设置为自动释放?

【中文标题】Objective-C 有没有办法判断一个对象是不是设置为自动释放?【英文标题】:Objective-C Is there a way to tell if an object is set to autorelease?Objective-C 有没有办法判断一个对象是否设置为自动释放? 【发布时间】:2012-02-23 08:27:58 【问题描述】:

我正在查看仪器的泄漏报告。我的一些泄漏指向方法 SBJSON。我很难相信返回的值不是自动释放的,但是在跟踪代码时,它变得非常乏味,包括使用引用调用返回值。我不认为代码跟踪是看待这个问题的正确方法。

有没有办法判断自动释放池中是否保留了任何对象? (我没有使用 ARC。)

更新

这是 Instruments 指向我的一些代码:

- (NSString *) processResults:(NSString *) resultsGeoCodeString 

    NSDictionary *resultsGeoCode = [resultsGeoCodeString JSONValue]; // <--- 100%
    ...

我假设“100%”意味着针对此案例报告的所有泄漏都源自此行。

我不释放对象resultsGeoCode,因为我假设它是自动释放的。

我使用的 SBJSON 套件没有使用 ARC。

【问题讨论】:

图书馆可能使用 ARC 吗? 我用一些有问题的代码更新了我的问题。我应该补充一点,显示的代码在单例中。我想知道这是否会导致它不被自动发布。如果是这样,我仍然不知道该怎么办。 【参考方案1】:

一般来说,知道一个对象是否在自动释放池中是没有帮助的。您可能会从方法中获取自动释放的对象,或者您可能会获取常量对象或单例或框架为自己的目的在内部保留的对象。

首先假设是您的代码而不是 SBJSON 导致了泄漏。 (SBJSON 是一个非常流行且使用良好的库,因此可能不再有任何严重的泄漏。)然后检查您对泄漏对象的处理方式。例如,您是否将它放在一个永远不会因任何原因而被释放的数组中。你是否在没有自动释放池的线程上自动释放它等等。尝试在此处发布您的代码。其他人也许能够发现泄漏。

【讨论】:

【参考方案2】:

Leaks 向您显示导致分配泄漏的代码行,而不是导致过度保留的代码行。跟着resultsGeoCode字典到处走;假设库中没有错误,则该对象在某处存在过度保留。

您可以使用 Instruments 显示任何给定对象的所有保留/释放事件。

【讨论】:

感谢您的提示。我必须稍后再做。我现在不在那台电脑前。但我会跟进你的情况。 我仍在处理这个问题。我认为问题在于在某处对某些 NSDictionary 处理不当。但我正在学习如何同时使用仪器,所以这比我预期的要长一点。但这是非常值得的。【参考方案3】:

这是原始的,但是您可以覆盖 autorelease、release 和 retain 方法(将消息传递给 super)并使用计数器设置日志消息(必要时进行子类化)。不幸的是,我不知道另一种方法,因为 retainCount 在这里对您没有多大帮助。

【讨论】:

以上是关于如何判断一个对象是不是被释放掉 C#的主要内容,如果未能解决你的问题,请参考以下文章

C# 线程运行完之后自己会不会释放掉

C#无法访问已释放的对象

如何判断窗口是不是被释放

在C#中如何判断一个对象是不是是某个类型的实例

如何判断目标 c 中是不是释放了按钮?

DELPHI 用TThread如何判断线程是不是存在 并且释放线程