有没有办法检查实例是否仍在内存中?

时间:2010-02-25 18:21:40

标签: iphone objective-c memory-management objective-c-runtime

示例:我有一个视图控制器并摆脱它。但是仍然有一个变量保存它的内存地址。访问它会导致EXEC_BAD_ACCESS。当然。但是:有没有办法检查该变量是否仍然有效?即如果它仍然指向内存中存在的东西?

4 个答案:

答案 0 :(得分:18)

您需要再次阅读:

Cocoa Memory Management Guidelines

简而言之,如果你想要一些东西,必须 retain

如果您希望某些内容消失并且之前已保留,则必须releaseautorelease

必须永远不会直接致电dealloc[super dealloc];方法结尾处的dealloc除外。

绝不能 releaseautorelease您没有retain的对象。

请注意,某些方法执行会返回您必须release的保留对象。如果您alloc是一个类的实例,则表示retain。如果您copy和实例,则保留副本。

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

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

哦,并使用Xcode中的构建和分析功能。它确实很好 - 但不是很完美 - 识别内存管理问题等等。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

使用“NSZombieEnabled”断点。

因此,只有强烈建议我们使用访问者。如果您的对象在任何地方被释放,它将被分配为nil,如果您在Nil对象上调用任何API或方法,则不会有任何损害。所以请养成使用Accessors的习惯。

您只需在构建设置中将此NSZombieEnabled标志作为参数添加到您的应用程序中。并启用它。现在,您以调试模式运行应用程序。如果即将发生任何此类崩溃,此断点将显示释放哪个对象以及崩溃的位置。

干杯, Manjunath

答案 3 :(得分:0)

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

MyClass * myVariable = [[MyClass alloc] init];

//发生了很多事......

if(myVariable!= nil) //做更多的事情