示例:我有一个视图控制器并摆脱它。但是仍然有一个变量保存它的内存地址。访问它会导致 EXEC_BAD_ACCESS。当然。但是:有什么方法可以检查该变量是否仍然有效?即如果它仍然指向内存中存在的东西?
4 回答
你需要再读一遍:
简而言之,如果你想要一些东西留在身边,你就必须 retain
这样做。
如果您希望某些东西消失并且您之前保留了它,那么您必须release
或autorelease
它。
您绝不能直接调用dealloc
(除了[super dealloc];
在您的每个dealloc
方法结束时)。
你绝不能 release
或autorelease
一个你没有的对象retain
。
请注意,某些方法确实会返回您必须保留的对象release
。如果你alloc
是一个类的实例,那意味着一个retain
. 如果您copy
和实例,则保留该副本。
如果您曾经想使用该retainCount
方法,请不要。它没用。仅将保留计数视为增量;加就必须减,但绝对值是一个实现细节,应该忽略。
(换句话说,即使有方法可以明确地检查对象的有效性——没有——这将是错误的答案。)
哦,使用 Xcode 中的构建和分析功能。它在识别内存管理问题等方面做得非常好——但不是很完美。
这就是整个内存管理模型的目的——如果你retain
在正确的时间和正确的时间release
调用autorelease
,那是不可能发生的。您可以使用它NSZombie
来帮助您调试。
使用“NSZombieEnabled”断点。
出于这个原因,只有所有人都强烈建议我们使用访问器。如果你的对象在任何地方被释放,它都会被赋值给 nil,如果你在 Nil 对象上调用任何 API 或方法也不会有任何危害。所以请养成使用访问器的习惯。
您只需将此 NSZombieEnabled 标志作为参数添加到构建设置中的应用程序。并启用它。现在您在调试模式下运行您的应用程序。如果即将发生任何此类崩溃,此断点将显示哪个对象被释放以及它在哪里崩溃。
干杯,曼朱纳特
如果通过变量,您的意思是指向您的对象的指针是否仍然引用有效内存然后:
MyClass *myVariable = [[MyClass alloc] init];
//发生了很多事情...
if (myVariable != nil) //做更多的事情