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

Posted

技术标签:

【中文标题】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 在这里对您没有多大帮助。

【讨论】:

以上是关于Objective-C 有没有办法判断一个对象是不是设置为自动释放?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C++:有没有办法出售 C++ 对象?

我如何判断一个对象是不是附加了键值观察器

JavaScript中如何判断一个对象是不是具有给定的属性

js怎么判断多层级对象是不是存在?

如何判断一个C++对象是不是在堆栈上

在objective-c中是不是有一个等效的sqlite .dump?