2

例如:我有一个视图控制器并摆脱它。但是仍然有一个变量存储着它的内存地址。在EXEC_BAD_ACCESS中访问该结果。当然。但是:有没有办法检查这个变量是否仍然有效?即如果它仍然指向内存中存在的东西?任何方式来检查一个实例是否仍在内存中?

+0

如果你问纯粹是为了调试原因,请说清楚。正如其他人所说,如果您要求在您的应用中实际发生的事情,那么这是一种糟糕的做法。 – Ken 2010-02-25 19:00:59

回答

18

您需要再次阅读:

Cocoa Memory Management Guidelines

总之,如果你想要坚持你的东西必须retain它。

如果你想要东西消失而你以前保留它,你必须releaseautorelease它。

绝不能呼叫dealloc直接(除[super dealloc];在您dealloc方法的每一个的结束)。

绝对不能releaseautorelease,你没有retain的对象。

注意到一些方法返回保留的对象,你必须release。如果你是alloc一个类的实例,那就意味着一个retain。如果你copy和实例,副本被保留。

如果您曾经尝试使用retainCount方法,请不要。这没有用。仅将保留计数视为增量;如果添加,则必须减去,但绝对值是应该忽略的实现细节。

(换句话说,即使有办法明确检查对象的有效性 - 有没有 - 那将是错误的答案)

哦,使用建立与分析功能在Xcode。它在确定内存管理问题等方面做得非常好,但并不完美。

+0

+1阿们,神甫。这是记忆管理的福音。 – 2010-02-25 20:25:53

2

这就是整个内存管理模型的设置 - 如果您在正确的时间调用retain,在合适的时间调用releaseautorelease,那是不可能发生的。您可以使用NSZombie来帮助您进行调试。

+0

是的,你不应该检查这种情况,你应该确保当你需要时保留这些对象,当你不需要时释放它们。 – Bearddo 2010-02-25 18:53:49

0

如果变量,你指的是指向你的对象是否仍然引用有效的内存,则:

MyClass的* MYVARIABLE = [[MyClass的页头] INIT];东西

//吨发生......

如果(MYVARIABLE =零!) //做更多的东西

1

使用“NSZombieEnabled”中断点。

由于这个原因,只有所有强烈建议我们使用访问器。如果你的对象在任何地方被释放,它将被赋值为零,并且如果你调用了Nil对象上的任何API或方法,将没有任何伤害。所以请养成使用Accessors的习惯。

您只需在构建设置中将此NSZombieEnabled标志添加为您的应用程序的参数即可。并启用它。现在你在调试模式下运行你的应用程序。如果任何这样的崩溃即将发生,这个断点将告诉你哪个对象被释放以及它在哪里崩溃。

干杯, Manjunath

相关问题