2

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

4

4 回答 4

18

你需要再读一遍:

Cocoa 内存管理指南

简而言之,如果你想要一些东西留在身边,你就必须 retain这样做。

如果您希望某些东西消失并且您之前保留了它,那么您必须releaseautorelease它。

绝不能直接调用dealloc(除了[super dealloc];在您的每个dealloc方法结束时)。

绝不能 releaseautorelease一个你没有的对象retain

请注意,某些方法确实会返回您必须保留的对象release。如果你alloc是一个类的实例,那意味着一个retain. 如果您copy和实例,则保留该副本。

如果您曾经想使用该retainCount方法,请不要。它没用。仅将保留计数视为增量;加就必须减,但绝对值是一个实现细节,应该忽略。

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

哦,使用 Xcode 中的构建和分析功能。它在识别内存管理问题等方面做得非常好——但不是很完美。

于 2010-02-25T18:56:45.217 回答
2

这就是整个内存管理模型的目的——如果你retain在正确的时间和正确的时间release调用autorelease,那是不可能发生的。您可以使用它NSZombie来帮助您调试。

于 2010-02-25T18:30:37.060 回答
1

使用“NSZombieEnabled”断点。

出于这个原因,只有所有人都强烈建议我们使用访问器。如果你的对象在任何地方被释放,它都会被赋值给 nil,如果你在 Nil 对象上调用任何 API 或方法也不会有任何危害。所以请养成使用访问器的习惯。

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

干杯,曼朱纳特

于 2010-02-26T06:11:26.090 回答
0

如果通过变量,您的意思是指向您的对象的指针是否仍然引用有效内存然后:

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

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

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

于 2010-02-25T18:45:15.883 回答